Hi Karl, 

Thanks for suggestion. 

My problem in the code seems to be more specific to pthread, because if I 
have the read( )  in a while loop, then the UART receive is running 
normally. Data arrived at the receive buffer are able to be pick up. 
However, the problem begin when I create UART Rx thread that just 
continuously reading the UART buffer. 



Regina


 

On Wednesday, July 20, 2016 at 3:21:44 PM UTC+8, Karl Karpfen wrote:
>
> 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 beagleboard+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/beagleboard/25f8dbc3-6b82-4ce0-8c2e-2c8fa4666710%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to