Discussion:
UART, serial port read C/C++
Andrey
2014-05-06 18:42:34 UTC
Permalink
Hello,

I need to use an UART to communicate between beaglebone and the device. I
have written the C code, but it has a few problems within it. I can't
identify the cause of the problem or to be more precise don't know how fix
it.

The problem is of
reading in the information and displaying it on a shell. I can easily write
any information data set that I wish, but when I try to read in response it
either doesn't read in, with the perror being displayed as (erno = EINTR [Interrupted
function call]) meaning read () function returned negative number.

#include <iostream>

#include <termios.h>

#include <stdio.h>

#include <unistd.h>

#include <fcntl.h>

#include <sys/signal.h>

#include <stdlib.h>

#include <sys/ioctl.h>

#include <errno.h>

#define BAUDRATE B19200

#define PORT "/dev/ttyO4"

#define _POSIX_SOURCE 1



#define FALSE 0

#define TRUE 1

volatile int STOP=FALSE;



void signal_handler_IO(int status);

int wait_flag = TRUE;



int main ()

{

int fd=0, res=0;

int check=0;



char SYNC [] = {0x55};

char PID [] = {0x6A};



struct termios oldtio, newtio;

struct sigaction saio;

char buff[255];



fd = open(PORT, O_RDWR | O_NOCTTY | O_NONBLOCK);

if (fd<0) {perror(PORT); exit(-1);}



saio.sa_handler=signal_handler_IO;

saio.sa_flags=0;

saio.sa_restorer = NULL;

sigaction(SIGIO, &saio,NULL);

fcntl(fd, F_SETFL, FASYNC);

check = tcgetattr(fd, &oldtio);

if (check<0){perror("tcgetattr");}



check = newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD ; if (check<0){
perror("c_cflag");}

check = newtio.c_iflag = IGNPAR | IXON; if (check<0){perror("c_iflag");}

check = newtio.c_oflag = 0; if (check<0){perror("c_oflag");}

//check = newtio.c_lflag = ICANON | ISIG;

check = newtio.c_lflag = 0; if (check<0){perror("c_lflag ");}
/* c_cc is responsible for an erno error */

check = newtio.c_cc[VMIN]=1; if (check<0){perror("c_cc[VMIN]");}

check = newtio.c_cc[VTIME]=0; if (check<0){perror("c_cc[VTIME]");}

tcflush(fd, TCIFLUSH);


check = tcsetattr(fd, TCSANOW, &newtio); if (check<0){perror("tcsetattr"
);}



for(;;)

{
ioctl(fd, TIOCSBRK);

usleep(1300);

ioctl(fd,TIOCCBRK);

usleep(200);


/* send request to actuator to receive the current setting and setup */
check = write(fd, SYNC, sizeof(SYNC)); if (check<0){perror("SYNC");}

check = write(fd,PID, sizeof(PID)); if (check<0){perror("PID");}

/* read response*/
res = read(fd, buff,255);
if (res < 0)

{

perror("read");
//if(errno ==EINTR) continue;
}

printf(": :%d :%d\n", res,buff);



usleep(10000);

}

close (fd);

}



void signal_handler_IO(int status)

{

wait_flag=FALSE;


e}

erno EINTR error is displayed only when i'm setting any non-zero values to
c_cc[VTIME] or c_cc[VMIN]. but still even if i set the both to zero, I
cannot read anything from the port, it's just blank.


I'm confident that i'm receiving response from the device, I have checked
it with oscilloscope.

Any assistance would be appreciated. if possible with the code examples for
me to see what should I modify.

Thank you very much for the help.
--
For more options, visit http://beagleboard.org/discuss
---
You received this message because you are subscribed to the Google Groups "BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email to beagleboard+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/***@public.gmane.org
For more options, visit https://groups.google.com/d/optout.
p***@public.gmane.org
2014-05-07 19:25:00 UTC
Permalink
// If you're guaranteed a response, try this with different VTIME and VMIN
settings. I usually use VMIN, VTIME = 0 and use select() to determine if
data is available.
do {
res = read(fd, buff, 255);
perror("read");
} while (res < 0 && errno == EINTR);
Post by Andrey
Hello,
I need to use an UART to communicate between beaglebone and the device. I
have written the C code, but it has a few problems within it. I can't
identify the cause of the problem or to be more precise don't know how fix
it.
The problem is of
reading in the information and displaying it on a shell. I can easily
write any information data set that I wish, but when I try to read in
response it either doesn't read in, with the perror being displayed as
(erno = EINTR [Interrupted function call]) meaning read () function
returned negative number.
#include <iostream>
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <errno.h>
#define BAUDRATE B19200
#define PORT "/dev/ttyO4"
#define _POSIX_SOURCE 1
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
void signal_handler_IO(int status);
int wait_flag = TRUE;
int main ()
{
int fd=0, res=0;
int check=0;
char SYNC [] = {0x55};
char PID [] = {0x6A};
struct termios oldtio, newtio;
struct sigaction saio;
char buff[255];
fd = open(PORT, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd<0) {perror(PORT); exit(-1);}
saio.sa_handler=signal_handler_IO;
saio.sa_flags=0;
saio.sa_restorer = NULL;
sigaction(SIGIO, &saio,NULL);
fcntl(fd, F_SETFL, FASYNC);
check = tcgetattr(fd, &oldtio);
if (check<0){perror("tcgetattr");}
check = newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD ; if (check<0
){perror("c_cflag");}
check = newtio.c_iflag = IGNPAR | IXON; if (check<0){perror("c_iflag"
);}
check = newtio.c_oflag = 0; if (check<0){perror("c_oflag");}
//check = newtio.c_lflag = ICANON | ISIG;
check = newtio.c_lflag = 0; if (check<0){perror("c_lflag ");}
/* c_cc is responsible for an erno error */
check = newtio.c_cc[VMIN]=1; if (check<0){perror("c_cc[VMIN]");}
check = newtio.c_cc[VTIME]=0; if (check<0){perror("c_cc[VTIME]");}
tcflush(fd, TCIFLUSH);
check = tcsetattr(fd, TCSANOW, &newtio); if (check<0){perror(
"tcsetattr");}
for(;;)
{
ioctl(fd, TIOCSBRK);
usleep(1300);
ioctl(fd,TIOCCBRK);
usleep(200);
/* send request to actuator to receive the current setting and setup */
check = write(fd, SYNC, sizeof(SYNC)); if (check<0){perror("SYNC");}
check = write(fd,PID, sizeof(PID)); if (check<0){perror("PID");}
/* read response*/
res = read(fd, buff,255);
if (res < 0)
{
perror("read");
//if(errno ==EINTR) continue;
}
printf(": :%d :%d\n", res,buff);
usleep(10000);
}
close (fd);
}
void signal_handler_IO(int status)
{
wait_flag=FALSE;
e}
erno EINTR error is displayed only when i'm setting any non-zero values to
c_cc[VTIME] or c_cc[VMIN]. but still even if i set the both to zero, I
cannot read anything from the port, it's just blank.
I'm confident that i'm receiving response from the device, I have checked
it with oscilloscope.
Any assistance would be appreciated. if possible with the code examples
for me to see what should I modify.
Thank you very much for the help.
--
For more options, visit http://beagleboard.org/discuss
---
You received this message because you are subscribed to the Google Groups "BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email to beagleboard+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/***@public.gmane.org
For more options, visit https://groups.google.com/d/optout.
Lê Hoàng Vũ
2014-05-17 03:05:45 UTC
Permalink
hi! can you give me driver for uart? thks
Post by Andrey
Hello,
I need to use an UART to communicate between beaglebone and the device. I
have written the C code, but it has a few problems within it. I can't
identify the cause of the problem or to be more precise don't know how fix
it.
The problem is of
reading in the information and displaying it on a shell. I can easily
write any information data set that I wish, but when I try to read in
response it either doesn't read in, with the perror being displayed as
(erno = EINTR [Interrupted function call]) meaning read () function
returned negative number.
#include <iostream>
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <errno.h>
#define BAUDRATE B19200
#define PORT "/dev/ttyO4"
#define _POSIX_SOURCE 1
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
void signal_handler_IO(int status);
int wait_flag = TRUE;
int main ()
{
int fd=0, res=0;
int check=0;
char SYNC [] = {0x55};
char PID [] = {0x6A};
struct termios oldtio, newtio;
struct sigaction saio;
char buff[255];
fd = open(PORT, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd<0) {perror(PORT); exit(-1);}
saio.sa_handler=signal_handler_IO;
saio.sa_flags=0;
saio.sa_restorer = NULL;
sigaction(SIGIO, &saio,NULL);
fcntl(fd, F_SETFL, FASYNC);
check = tcgetattr(fd, &oldtio);
if (check<0){perror("tcgetattr");}
check = newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD ; if (check<0
){perror("c_cflag");}
check = newtio.c_iflag = IGNPAR | IXON; if (check<0){perror("c_iflag"
);}
check = newtio.c_oflag = 0; if (check<0){perror("c_oflag");}
//check = newtio.c_lflag = ICANON | ISIG;
check = newtio.c_lflag = 0; if (check<0){perror("c_lflag ");}
/* c_cc is responsible for an erno error */
check = newtio.c_cc[VMIN]=1; if (check<0){perror("c_cc[VMIN]");}
check = newtio.c_cc[VTIME]=0; if (check<0){perror("c_cc[VTIME]");}
tcflush(fd, TCIFLUSH);
check = tcsetattr(fd, TCSANOW, &newtio); if (check<0){perror(
"tcsetattr");}
for(;;)
{
ioctl(fd, TIOCSBRK);
usleep(1300);
ioctl(fd,TIOCCBRK);
usleep(200);
/* send request to actuator to receive the current setting and setup */
check = write(fd, SYNC, sizeof(SYNC)); if (check<0){perror("SYNC");}
check = write(fd,PID, sizeof(PID)); if (check<0){perror("PID");}
/* read response*/
res = read(fd, buff,255);
if (res < 0)
{
perror("read");
//if(errno ==EINTR) continue;
}
printf(": :%d :%d\n", res,buff);
usleep(10000);
}
close (fd);
}
void signal_handler_IO(int status)
{
wait_flag=FALSE;
e}
erno EINTR error is displayed only when i'm setting any non-zero values to
c_cc[VTIME] or c_cc[VMIN]. but still even if i set the both to zero, I
cannot read anything from the port, it's just blank.
I'm confident that i'm receiving response from the device, I have checked
it with oscilloscope.
Any assistance would be appreciated. if possible with the code examples
for me to see what should I modify.
Thank you very much for the help.
--
For more options, visit http://beagleboard.org/discuss
---
You received this message because you are subscribed to the Google Groups "BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email to beagleboard+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/***@public.gmane.org
For more options, visit https://groups.google.com/d/optout.
Simon Platten
2014-05-17 10:53:29 UTC
Permalink
This is a snippet of code from my JNI C libary which works:
[code]
JNIEXPORT jint JNICALL Java_cantley_co_uk_clsMain_openDevice
(JNIEnv *pEnv, jclass obj, jstring strDevice, jboolean blnRx, jboolean
blnDebug) {
const char *pstrDevice = (*pEnv)->GetStringUTFChars(pEnv, strDevice,
NULL);
// Try to open the port
int intFD = open(pstrDevice, O_RDWR | O_NOCTTY | O_NDELAY);

if ( intFD >= 0 ) {
struct termios options;
// Get the current options for the port...
tcgetattr(intFD, &options);
// Set the baud rates to 115200...
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
// options.c_cflag |= (CLOCAL | CREAD);
options.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR |
IGNCR | ICRNL | IXON);
options.c_oflag &= ~OPOST;
options.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
options.c_cflag &= ~(CSIZE | PARENB);
options.c_cflag |= CS8;

if ( blnRx == JNI_TRUE ) {
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] = 2;
} else {
// non-blocking, we aren't reading
options.c_cc[VMIN] = options.c_cc[VTIME] = 0;
}
tcsetattr(intFD, TCSANOW, &options);

if ( blnRx == JNI_TRUE ) {
tcflush(intFD, TCIFLUSH);
}
fcntl(intFD, F_SETFL, FNDELAY);

if ( blnDebug == JNI_TRUE ) {
printf("%s opened and ready for use%s", pstrDevice, pstrEOL);
}
} else if ( blnDebug == JNI_TRUE ) {
printf("%s, port not ready%s", pstrDevice, pstrEOL);
}
(*pEnv)->ReleaseStringUTFChars(pEnv, strDevice, pstrDevice);
return intFD;
}
[/code]
Post by Andrey
Hello,
I need to use an UART to communicate between beaglebone and the device. I
have written the C code, but it has a few problems within it. I can't
identify the cause of the problem or to be more precise don't know how fix
it.
The problem is of
reading in the information and displaying it on a shell. I can easily
write any information data set that I wish, but when I try to read in
response it either doesn't read in, with the perror being displayed as
(erno = EINTR [Interrupted function call]) meaning read () function
returned negative number.
#include <iostream>
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <errno.h>
#define BAUDRATE B19200
#define PORT "/dev/ttyO4"
#define _POSIX_SOURCE 1
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
void signal_handler_IO(int status);
int wait_flag = TRUE;
int main ()
{
int fd=0, res=0;
int check=0;
char SYNC [] = {0x55};
char PID [] = {0x6A};
struct termios oldtio, newtio;
struct sigaction saio;
char buff[255];
fd = open(PORT, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd<0) {perror(PORT); exit(-1);}
saio.sa_handler=signal_handler_IO;
saio.sa_flags=0;
saio.sa_restorer = NULL;
sigaction(SIGIO, &saio,NULL);
fcntl(fd, F_SETFL, FASYNC);
check = tcgetattr(fd, &oldtio);
if (check<0){perror("tcgetattr");}
check = newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD ; if (check<0
){perror("c_cflag");}
check = newtio.c_iflag = IGNPAR | IXON; if (check<0){perror("c_iflag"
);}
check = newtio.c_oflag = 0; if (check<0){perror("c_oflag");}
//check = newtio.c_lflag = ICANON | ISIG;
check = newtio.c_lflag = 0; if (check<0){perror("c_lflag ");}
/* c_cc is responsible for an erno error */
check = newtio.c_cc[VMIN]=1; if (check<0){perror("c_cc[VMIN]");}
check = newtio.c_cc[VTIME]=0; if (check<0){perror("c_cc[VTIME]");}
tcflush(fd, TCIFLUSH);
check = tcsetattr(fd, TCSANOW, &newtio); if (check<0){perror(
"tcsetattr");}
for(;;)
{
ioctl(fd, TIOCSBRK);
usleep(1300);
ioctl(fd,TIOCCBRK);
usleep(200);
/* send request to actuator to receive the current setting and setup */
check = write(fd, SYNC, sizeof(SYNC)); if (check<0){perror("SYNC");}
check = write(fd,PID, sizeof(PID)); if (check<0){perror("PID");}
/* read response*/
res = read(fd, buff,255);
if (res < 0)
{
perror("read");
//if(errno ==EINTR) continue;
}
printf(": :%d :%d\n", res,buff);
usleep(10000);
}
close (fd);
}
void signal_handler_IO(int status)
{
wait_flag=FALSE;
e}
erno EINTR error is displayed only when i'm setting any non-zero values to
c_cc[VTIME] or c_cc[VMIN]. but still even if i set the both to zero, I
cannot read anything from the port, it's just blank.
I'm confident that i'm receiving response from the device, I have checked
it with oscilloscope.
Any assistance would be appreciated. if possible with the code examples
for me to see what should I modify.
Thank you very much for the help.
--
For more options, visit http://beagleboard.org/discuss
---
You received this message because you are subscribed to the Google Groups "BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email to beagleboard+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/***@public.gmane.org
For more options, visit https://groups.google.com/d/optout.
Lê Hoàng Vũ
2014-05-17 11:22:57 UTC
Permalink
I need uart driver for insmod kernel,can you help me!
Post by Simon Platten
[code]
JNIEXPORT jint JNICALL Java_cantley_co_uk_clsMain_openDevice
(JNIEnv *pEnv, jclass obj, jstring strDevice, jboolean blnRx, jboolean
blnDebug) {
const char *pstrDevice = (*pEnv)->GetStringUTFChars(pEnv, strDevice,
NULL);
// Try to open the port
int intFD = open(pstrDevice, O_RDWR | O_NOCTTY | O_NDELAY);
if ( intFD >= 0 ) {
struct termios options;
// Get the current options for the port...
tcgetattr(intFD, &options);
// Set the baud rates to 115200...
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
// options.c_cflag |= (CLOCAL | CREAD);
options.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR |
IGNCR | ICRNL | IXON);
options.c_oflag &= ~OPOST;
options.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
options.c_cflag &= ~(CSIZE | PARENB);
options.c_cflag |= CS8;
if ( blnRx == JNI_TRUE ) {
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] = 2;
} else {
// non-blocking, we aren't reading
options.c_cc[VMIN] = options.c_cc[VTIME] = 0;
}
tcsetattr(intFD, TCSANOW, &options);
if ( blnRx == JNI_TRUE ) {
tcflush(intFD, TCIFLUSH);
}
fcntl(intFD, F_SETFL, FNDELAY);
if ( blnDebug == JNI_TRUE ) {
printf("%s opened and ready for use%s", pstrDevice, pstrEOL);
}
} else if ( blnDebug == JNI_TRUE ) {
printf("%s, port not ready%s", pstrDevice, pstrEOL);
}
(*pEnv)->ReleaseStringUTFChars(pEnv, strDevice, pstrDevice);
return intFD;
}
[/code]
Post by Andrey
Hello,
I need to use an UART to communicate between beaglebone and the device. I
have written the C code, but it has a few problems within it. I can't
identify the cause of the problem or to be more precise don't know how fix
it.
The problem is of
reading in the information and displaying it on a shell. I can easily
write any information data set that I wish, but when I try to read in
response it either doesn't read in, with the perror being displayed as
(erno = EINTR [Interrupted function call]) meaning read () function
returned negative number.
#include <iostream>
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <errno.h>
#define BAUDRATE B19200
#define PORT "/dev/ttyO4"
#define _POSIX_SOURCE 1
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
void signal_handler_IO(int status);
int wait_flag = TRUE;
int main ()
{
int fd=0, res=0;
int check=0;
char SYNC [] = {0x55};
char PID [] = {0x6A};
struct termios oldtio, newtio;
struct sigaction saio;
char buff[255];
fd = open(PORT, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd<0) {perror(PORT); exit(-1);}
saio.sa_handler=signal_handler_IO;
saio.sa_flags=0;
saio.sa_restorer = NULL;
sigaction(SIGIO, &saio,NULL);
fcntl(fd, F_SETFL, FASYNC);
check = tcgetattr(fd, &oldtio);
if (check<0){perror("tcgetattr");}
check = newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD ; if (check<0
){perror("c_cflag");}
check = newtio.c_iflag = IGNPAR | IXON; if (check<0){perror("c_iflag"
);}
check = newtio.c_oflag = 0; if (check<0){perror("c_oflag");}
//check = newtio.c_lflag = ICANON | ISIG;
check = newtio.c_lflag = 0; if (check<0){perror("c_lflag ");}
/* c_cc is responsible for an erno error */
check = newtio.c_cc[VMIN]=1; if (check<0){perror("c_cc[VMIN]");}
check = newtio.c_cc[VTIME]=0; if (check<0){perror("c_cc[VTIME]");}
tcflush(fd, TCIFLUSH);
check = tcsetattr(fd, TCSANOW, &newtio); if (check<0){perror(
"tcsetattr");}
for(;;)
{
ioctl(fd, TIOCSBRK);
usleep(1300);
ioctl(fd,TIOCCBRK);
usleep(200);
/* send request to actuator to receive the current setting and setup */
check = write(fd, SYNC, sizeof(SYNC)); if (check<0){perror("SYNC");}
check = write(fd,PID, sizeof(PID)); if (check<0){perror("PID");}
/* read response*/
res = read(fd, buff,255);
if (res < 0)
{
perror("read");
//if(errno ==EINTR) continue;
}
printf(": :%d :%d\n", res,buff);
usleep(10000);
}
close (fd);
}
void signal_handler_IO(int status)
{
wait_flag=FALSE;
e}
erno EINTR error is displayed only when i'm setting any non-zero values to
c_cc[VTIME] or c_cc[VMIN]. but still even if i set the both to zero, I
cannot read anything from the port, it's just blank.
I'm confident that i'm receiving response from the device, I have checked
it with oscilloscope.
Any assistance would be appreciated. if possible with the code examples
for me to see what should I modify.
Thank you very much for the help.
--
For more options, visit http://beagleboard.org/discuss
---
You received this message because you are subscribed to a topic in the
Google Groups "BeagleBoard" group.
To unsubscribe from this topic, visit
https://groups.google.com/d/topic/beagleboard/vbRrGiqZyfs/unsubscribe.
To unsubscribe from this group and all its topics, send an email to
For more options, visit https://groups.google.com/d/optout.
--
For more options, visit http://beagleboard.org/discuss
---
You received this message because you are subscribed to the Google Groups "BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email to beagleboard+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/***@public.gmane.org
For more options, visit https://groups.google.com/d/optout.
Simon Platten
2014-05-17 18:08:56 UTC
Permalink
Sorry, I know nothing about the insmod kernel, can you tell me more?
Post by Lê Hoàng Vũ
I need uart driver for insmod kernel,can you help me!
Post by Simon Platten
[code]
JNIEXPORT jint JNICALL Java_cantley_co_uk_clsMain_openDevice
(JNIEnv *pEnv, jclass obj, jstring strDevice, jboolean blnRx, jboolean
blnDebug) {
const char *pstrDevice = (*pEnv)->GetStringUTFChars(pEnv, strDevice,
NULL);
// Try to open the port
int intFD = open(pstrDevice, O_RDWR | O_NOCTTY | O_NDELAY);
if ( intFD >= 0 ) {
struct termios options;
// Get the current options for the port...
tcgetattr(intFD, &options);
// Set the baud rates to 115200...
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
// options.c_cflag |= (CLOCAL | CREAD);
options.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR |
IGNCR | ICRNL | IXON);
options.c_oflag &= ~OPOST;
options.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
options.c_cflag &= ~(CSIZE | PARENB);
options.c_cflag |= CS8;
if ( blnRx == JNI_TRUE ) {
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] = 2;
} else {
// non-blocking, we aren't reading
options.c_cc[VMIN] = options.c_cc[VTIME] = 0;
}
tcsetattr(intFD, TCSANOW, &options);
if ( blnRx == JNI_TRUE ) {
tcflush(intFD, TCIFLUSH);
}
fcntl(intFD, F_SETFL, FNDELAY);
if ( blnDebug == JNI_TRUE ) {
printf("%s opened and ready for use%s", pstrDevice, pstrEOL);
}
} else if ( blnDebug == JNI_TRUE ) {
printf("%s, port not ready%s", pstrDevice, pstrEOL);
}
(*pEnv)->ReleaseStringUTFChars(pEnv, strDevice, pstrDevice);
return intFD;
}
[/code]
Post by Andrey
Hello,
I need to use an UART to communicate between beaglebone and the device. I
have written the C code, but it has a few problems within it. I can't
identify the cause of the problem or to be more precise don't know how fix
it.
The problem is of
reading in the information and displaying it on a shell. I can easily
write any information data set that I wish, but when I try to read in
response it either doesn't read in, with the perror being displayed as
(erno = EINTR [Interrupted function call]) meaning read () function
returned negative number.
#include <iostream>
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <errno.h>
#define BAUDRATE B19200
#define PORT "/dev/ttyO4"
#define _POSIX_SOURCE 1
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
void signal_handler_IO(int status);
int wait_flag = TRUE;
int main ()
{
int fd=0, res=0;
int check=0;
char SYNC [] = {0x55};
char PID [] = {0x6A};
struct termios oldtio, newtio;
struct sigaction saio;
char buff[255];
fd = open(PORT, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd<0) {perror(PORT); exit(-1);}
saio.sa_handler=signal_handler_IO;
saio.sa_flags=0;
saio.sa_restorer = NULL;
sigaction(SIGIO, &saio,NULL);
fcntl(fd, F_SETFL, FASYNC);
check = tcgetattr(fd, &oldtio);
if (check<0){perror("tcgetattr");}
check = newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD ; if (check<0
){perror("c_cflag");}
check = newtio.c_iflag = IGNPAR | IXON; if (check<0){perror("c_iflag"
);}
check = newtio.c_oflag = 0; if (check<0){perror("c_oflag");}
//check = newtio.c_lflag = ICANON | ISIG;
check = newtio.c_lflag = 0; if (check<0){perror("c_lflag ");}
/* c_cc is responsible for an erno error */
check = newtio.c_cc[VMIN]=1; if (check<0){perror("c_cc[VMIN]");}
check = newtio.c_cc[VTIME]=0; if (check<0){perror("c_cc[VTIME]");}
tcflush(fd, TCIFLUSH);
check = tcsetattr(fd, TCSANOW, &newtio); if (check<0){perror(
"tcsetattr");}
for(;;)
{
ioctl(fd, TIOCSBRK);
usleep(1300);
ioctl(fd,TIOCCBRK);
usleep(200);
/* send request to actuator to receive the current setting and setup */
check = write(fd, SYNC, sizeof(SYNC)); if (check<0){perror("SYNC");}
check = write(fd,PID, sizeof(PID)); if (check<0){perror("PID");}
/* read response*/
res = read(fd, buff,255);
if (res < 0)
{
perror("read");
//if(errno ==EINTR) continue;
}
printf(": :%d :%d\n", res,buff);
usleep(10000);
}
close (fd);
}
void signal_handler_IO(int status)
{
wait_flag=FALSE;
e}
erno EINTR error is displayed only when i'm setting any non-zero values to
c_cc[VTIME] or c_cc[VMIN]. but still even if i set the both to zero, I
cannot read anything from the port, it's just blank.
I'm confident that i'm receiving response from the device, I have checked
it with oscilloscope.
Any assistance would be appreciated. if possible with the code examples
for me to see what should I modify.
Thank you very much for the help.
--
For more options, visit http://beagleboard.org/discuss
---
You received this message because you are subscribed to a topic in the
Google Groups "BeagleBoard" group.
To unsubscribe from this topic, visit
https://groups.google.com/d/topic/beagleboard/vbRrGiqZyfs/unsubscribe.
To unsubscribe from this group and all its topics, send an email to
For more options, visit https://groups.google.com/d/optout.
---
This email is free from viruses and malware because avast! Antivirus protection is active.
http://www.avast.com
--
For more options, visit http://beagleboard.org/discuss
---
You received this message because you are subscribed to the Google Groups "BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email to beagleboard+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/***@public.gmane.org
For more options, visit https://groups.google.com/d/optout.
Lê Hoàng Vũ
2014-05-17 18:31:56 UTC
Permalink
how to use BeagBone uart4? you need build the uart driver and then insert
kernel.i need file uart driver.
Post by Simon Platten
Sorry, I know nothing about the insmod kernel, can you tell me more?
Post by Lê Hoàng Vũ
I need uart driver for insmod kernel,can you help me!
Post by Simon Platten
[code]
JNIEXPORT jint JNICALL Java_cantley_co_uk_clsMain_openDevice
(JNIEnv *pEnv, jclass obj, jstring strDevice, jboolean blnRx, jboolean
blnDebug) {
const char *pstrDevice = (*pEnv)->GetStringUTFChars(pEnv, strDevice,
NULL);
// Try to open the port
int intFD = open(pstrDevice, O_RDWR | O_NOCTTY | O_NDELAY);
if ( intFD >= 0 ) {
struct termios options;
// Get the current options for the port...
tcgetattr(intFD, &options);
// Set the baud rates to 115200...
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
// options.c_cflag |= (CLOCAL | CREAD);
options.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR |
IGNCR | ICRNL | IXON);
options.c_oflag &= ~OPOST;
options.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
options.c_cflag &= ~(CSIZE | PARENB);
options.c_cflag |= CS8;
if ( blnRx == JNI_TRUE ) {
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] = 2;
} else {
// non-blocking, we aren't reading
options.c_cc[VMIN] = options.c_cc[VTIME] = 0;
}
tcsetattr(intFD, TCSANOW, &options);
if ( blnRx == JNI_TRUE ) {
tcflush(intFD, TCIFLUSH);
}
fcntl(intFD, F_SETFL, FNDELAY);
if ( blnDebug == JNI_TRUE ) {
printf("%s opened and ready for use%s", pstrDevice, pstrEOL);
}
} else if ( blnDebug == JNI_TRUE ) {
printf("%s, port not ready%s", pstrDevice, pstrEOL);
}
(*pEnv)->ReleaseStringUTFChars(pEnv, strDevice, pstrDevice);
return intFD;
}
[/code]
Post by Andrey
Hello,
I need to use an UART to communicate between beaglebone and the device. I
have written the C code, but it has a few problems within it. I can't
identify the cause of the problem or to be more precise don't know how fix
it.
The problem is of
reading in the information and displaying it on a shell. I can easily
write any information data set that I wish, but when I try to read in
response it either doesn't read in, with the perror being displayed as
(erno = EINTR [Interrupted function call]) meaning read () function
returned negative number.
#include <iostream>
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <errno.h>
#define BAUDRATE B19200
#define PORT "/dev/ttyO4"
#define _POSIX_SOURCE 1
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
void signal_handler_IO(int status);
int wait_flag = TRUE;
int main ()
{
int fd=0, res=0;
int check=0;
char SYNC [] = {0x55};
char PID [] = {0x6A};
struct termios oldtio, newtio;
struct sigaction saio;
char buff[255];
fd = open(PORT, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd<0) {perror(PORT); exit(-1);}
saio.sa_handler=signal_handler_IO;
saio.sa_flags=0;
saio.sa_restorer = NULL;
sigaction(SIGIO, &saio,NULL);
fcntl(fd, F_SETFL, FASYNC);
check = tcgetattr(fd, &oldtio);
if (check<0){perror("tcgetattr");}
check = newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD ; if (check<0
){perror("c_cflag");}
check = newtio.c_iflag = IGNPAR | IXON; if
(check<0){perror("c_iflag"
);}
check = newtio.c_oflag = 0; if (check<0){perror("c_oflag");}
//check = newtio.c_lflag = ICANON | ISIG;
check = newtio.c_lflag = 0; if (check<0){perror("c_lflag ");}
/* c_cc is responsible for an erno error */
check = newtio.c_cc[VMIN]=1; if (check<0){perror("c_cc[VMIN]");}
check = newtio.c_cc[VTIME]=0; if (check<0){perror("c_cc[VTIME]");}
tcflush(fd, TCIFLUSH);
check = tcsetattr(fd, TCSANOW, &newtio); if (check<0){perror(
"tcsetattr");}
for(;;)
{
ioctl(fd, TIOCSBRK);
usleep(1300);
ioctl(fd,TIOCCBRK);
usleep(200);
/* send request to actuator to receive the current setting and setup */
check = write(fd, SYNC, sizeof(SYNC)); if
(check<0){perror("SYNC");}
check = write(fd,PID, sizeof(PID)); if (check<0){perror("PID");}
/* read response*/
res = read(fd, buff,255);
if (res < 0)
{
perror("read");
//if(errno ==EINTR) continue;
}
printf(": :%d :%d\n", res,buff);
usleep(10000);
}
close (fd);
}
void signal_handler_IO(int status)
{
wait_flag=FALSE;
e}
erno EINTR error is displayed only when i'm setting any non-zero values to
c_cc[VTIME] or c_cc[VMIN]. but still even if i set the both to zero, I
cannot read anything from the port, it's just blank.
I'm confident that i'm receiving response from the device, I have checked
it with oscilloscope.
Any assistance would be appreciated. if possible with the code examples
for me to see what should I modify.
Thank you very much for the help.
--
For more options, visit http://beagleboard.org/discuss
---
You received this message because you are subscribed to a topic in the
Google Groups "BeagleBoard" group.
To unsubscribe from this topic, visit
https://groups.google.com/d/topic/beagleboard/vbRrGiqZyfs/unsubscribe.
To unsubscribe from this group and all its topics, send an email to
For more options, visit https://groups.google.com/d/optout.
---
This email is free from viruses and malware because avast! Antivirus protection is active.
http://www.avast.com
--
For more options, visit http://beagleboard.org/discuss
--- You received this message because you are subscribed to a topic in the
Google Groups "BeagleBoard" group.
To unsubscribe from this topic, visit https://groups.google.com/d/
topic/beagleboard/vbRrGiqZyfs/unsubscribe.
To unsubscribe from this group and all its topics, send an email to
For more options, visit https://groups.google.com/d/optout.
--
For more options, visit http://beagleboard.org/discuss
---
You received this message because you are subscribed to the Google Groups "BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email to beagleboard+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/***@public.gmane.org
For more options, visit https://groups.google.com/d/optout.
Loading...