Serial interface initialisation on Linux systems is a mess and it is easy 
to forget something. That's why I would recommend to use a library which 
does all the work for you like liboapc 
from https://sourceforge.net/p/oapc/code/ci/master/tree/liboapc/

Am Mittwoch, 20. Juli 2016 08:56:50 UTC+2 schrieb Regina Choi:
>
>
> Hi, 
>
> I have programmed (in C) UART4 read in thread with blocking read, the code 
> as below: I confirmed that the UART receive port does have data through 
> oscilloscope, but somehow there is no data in read( ), the return count 
> always zero ?  
>
> The strange thing is if minicom is open on the Uart4, then the read( ) in 
> receive thread started to run as normal.  However, the regular file write 
> become weird.  The string won't be able to be written into file ?! 
>
> Btw, my BBB version is 3.8.13-bone47
>
>
> #include<stdio.h>
> #include<stdlib.h>        // required for fopen, exit()
> #include<fcntl.h>
> #include<termios.h>
> //#include<string.h>
> #include<unistd.h>
> #include<pthread.h>
> #include "readerComm.h"
>
>
> pthread_t uartRxT , uartTxT;
> int file, file2;
>
> int main (int argc, char* argv[])
> {
>     int count;
>  
>     pthread_attr_t attr;
>     void *status;
>     FILE *fdata;
>
>
>     if(argc != 2)
>     {
>
>         printf("Invalid number of arguments, exiting!");
>         return -2;
>
>     }
>
>     if((file = open("/dev/ttyO4", O_RDWR | O_NOCTTY | O_NDELAY ))< 0)
>     {
>         perror("UART: Failed to open the file");
>         return -1;
>     }
>
>     fcntl(file, F_SETFL, 0);     // blocking read
>     struct termios options; //oriopt
>     tcgetattr(file, &options);
>     options.c_cflag = B9600 | CS8 | CREAD | CLOCAL;
>     options.c_iflag = IGNPAR | ICRNL;
>
>     options.c_iflag &= ~IGNBRK;
>     options.c_iflag &= ~(IXON | IXOFF | IXANY); // shut off xon/xoff ctrl
>
>     options.c_cc[VMIN]  = 2;    // Non Canonical input mode (as we didnt 
> set ICANON for c_lflag)
>     options.c_cc[VTIME] = 10;    // 1 sec timeout
>
>
>     tcflush(file, TCIFLUSH);
>
>     tcsetattr(file, TCSANOW, &options);
>
>
>     unsigned char cmd[] = {0x11, 0x00, 0x32};    //"Tx From Beaglebone ";
>
>     if ((count = write(file, (char*)cmd, 3))<0){
>           perror("Failed to write to the output\n");
>           return -1;
>      }else{
>          printf("Byte sent: %d \n", count);
>      }
>
>     fdata = fopen("capture.dat", "w");
>     if (fdata == NULL) {
>             printf("I couldn't open capture.dat for writing.\n");
>             exit(0);
>     }
>
>     // save in file ( cannot print to file ??)
>     fprintf(fdata, "%s", "test");
>     perror("UART: Test comment");
>
>
>     pthread_attr_init(&attr);
>     pthread_attr_setdetachstate(&
> attr, PTHREAD_CREATE_JOINABLE);
>
>     // Create UArt Tx thread
>     if(pthread_create(&uartTxT, &attr, &uartTxWait, NULL)){
>         perror("GPIO: Failed to create the tx thread");
>
>         return -1;
>     }
>
>     // Create Uart Rx thread
>     if(pthread_create(&uartRxT, &attr, &uartRxWait, NULL)){
>         perror("GPIO: Failed to create the rx thread");
>
>         return -1;
>     }
>
>     pthread_attr_destroy(&attr);
>     pthread_join(uartRxT,&status);
>     pthread_join(uartTxT,&status);
>
>     close(file);    // close first file descriptor
>
>     // capture.dat file close
>     fclose(fdata);
>
>     return 0;
>
> }
>
> // UART RX thread
> void* uartRxWait(void *param){
>
>     unsigned char receive[100];
>     int count, n;
>     fd_set input;
>     struct timeval timeout;
>
>     //initialize input set
>     FD_ZERO(&input);
>     FD_SET(file, &input);
>
>     timeout.tv_sec=0;
>     timeout.tv_usec=0;
>
>     while(1){
>        
>             if ((count = read(file, (void *)receive, 100))<0)
>             {
>                 perror("Failed to read from input \n");
>                 printf("count = %d\n", count);
>             }else{
>
>                 if(receive[2]==0x32){
>                     printf("Header received \n"); 
>                 }
>                     printf("Byte received [%d] \n", count);
>                     printf("Value of Pi = 0x%.2x\n", receive[0]);
>
>           }
>  
>     }
>
>     pthread_exit(0);
> }
>
>
> void* uartTxWait(void *param){
>
>     usleep(1000000);
>     pthread_exit(0);
> }
>

-- 
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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/beagleboard/2280948f-e89f-4c51-90a8-71386ebcd1d8%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to