LINUX.ORG.RU

Непонятности в чтении /dev/ttyUSB

 


0

2

Здраствуйте.

Есть программа работающая на роутере (asus wl-500), которая читает данные от ардуины и пресылает их куда надо.

Вот так открываю порт:

int open_port()  
 {  
   int fd;  
   fd = open(device, O_RDWR | O_NOCTTY); //|O_NONBLOCK); 
 
   if(fd == -1) 
     {  
       strncpy(er_log_str, "Error - NOT open port.", 31);
       error_log();
     }

   else  
     {  
       struct termios options;  
       tcgetattr(fd, &options);  
       cfsetispeed(&options, B57600);  
       cfsetospeed(&options, B57600);  
       options.c_cflag |= (CLOCAL | CREAD); 
       options.c_cflag &= ~PARENB;  
       options.c_cflag &= ~CSTOPB;  
       options.c_cflag &= ~CSIZE;  
       options.c_cflag |= CS8;  
       options.c_cc[VMIN] = 1;  
       options.c_cc[VTIME] = 1;  
       options.c_lflag = ICANON;  
       options.c_oflag = 0;  
       options.c_oflag &= ~OPOST; 
       tcflush(fd, TCIFLUSH);
       tcsetattr(fd, TCSANOW, &options);  
     }  

   return fd;  
 }

...

В цикле ожидаю данных (ардуина посылает их ~два раза в сек.). Чтение блокируется пока нет данных.

...
  char bRead[BUFSIZE] = {0,}; 
  int err_count1 = 0; 
  unsigned int i = 0;


  while(!VINTR) 
   {     
      int bytes = 0;
      memset(bRead, 0, sizeof(bRead));

      if((bytes = read(fd, bRead, BUFSIZE))==-1)
        {
          printf("Error read.\n");
        }

      printf("bytes: %d\n\n", bytes); 

      for(i = 0; i<=strlen(bRead); i++)
       {
         if(bRead[i] == '\r' || bRead[i] == '\n')
          {
            bRead[i] = 0;
            tcflush(fd, TCIFLUSH); 
            break;
          }
       } 

     //////////////////////// Проверка A-Z /////////////////////////////////////
     if(bRead[0] == 'A' && bRead[strlen(bRead)-1] == 'Z')     
      {
        err_count1 = 0;
        printf("OK A-Z\n"); 
      }

     else
      {
        tcflush(fd, TCIFLUSH);  
        err_count1++;
      
        if(err_count1 > 10) 
          {
            strncpy(er_log_str, "Not A-Z.", 31);
            error_log();
          }

        printf("Not_A-Z_bRead: %s\n\n", bRead); 
        continue;
      } 

     host = gethostbyname("192.168.1.1"); // 192.168.1.1
     memset((char *) &server, 0, sizeof(struct sockaddr_in));
     server.sin_family = AF_INET;
     server.sin_port = htons(3495);
     server.sin_addr = *((struct in_addr*) host->h_addr);

     if(sendto(sockfd, bRead, strlen(bRead), 0, (struct sockaddr *) &server, sizeof(server)) < 0)
        {
           strncpy(er_log_str, "ERROR sendto.", 31);
           error_log();
        }

     printf("bRead: %s\n\n", bRead);
    

   } // Конец основного цикла (while) 
...

Суть работы такова:

Ардуина посылает строку - «A 1 1 1 1 1 1 1 1 1 1 1 0 0 Z».

read() - её ловит.

for(i = 0; i<=strlen(bRead); i++) - отыскивает конец строки.

if(bRead[0] == 'A' && bRead[strlen(bRead)-1] == 'Z') - проверяет первый и последний символ, и если всё хорошо, тогда эти данные отправляются по UDP.

Если проверка «A...Z» неудачная, то возврат к началу цикла (while(!VINTR)).

Вопрос заключается в следующем:

В представленном выше виде, всё работает хорошо, ошибок «A...Z» нет. Однако если убрать строчку «printf(„bytes: %d\n\n“, bytes);», которая идёт после read():

...
  while(!VINTR) 
   {     
      int bytes = 0;
      memset(bRead, 0, sizeof(bRead));

      if((bytes = read(fd, bRead, BUFSIZE))==-1)
        {
          printf("Error read.\n");
        }

      printf("bytes: %d\n\n", bytes); // эта строчка
...
Тогда время от времени начинает появляться ошибка «Not_A-Z_bRead:», причём массив «bRead» пустой, то есть как будто ничего не получено.
...
  if(err_count1 > 10) 
   {
     strncpy(er_log_str, "Not A-Z.", 31);
     error_log();
   }

  printf("Not_A-Z_bRead: %s\n\n", bRead); 
  continue;
...

Если вместо злосчастной строки «printf(„bytes: %d\n\n“, bytes);» вставить паузу, хотя бы на одну микросекунду (usleep(1);), то ошибка исчезает. Иными словами, получается что после read() зачем-то нужна крохотная задержка.

Как объяснить такое поведение? Причём это проявляется только на роутере, если запускать прогу на «большом компе», то ошибок нет.



Последнее исправление: stD (всего исправлений: 5)

Разобрался.

stD
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.