Связь через последовательный порт в Linux возвращает неверные ответы

Я пытаюсь создать программу Linux Ubuntu, которая будет считывать данные с последовательного порта tty (COM-порт в Windows). Я использую не USB-адаптер, а настоящий COM-порт. Это мой код для связи до сих пор:

int OpenPort(void)
{
   int fd; // file description for sp

   fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_SYNC);

   if(fd == -1) // port not opened 
   {
      printf("Error:\n%s.\n", strerror(errno));
   }
   else
   {
      fcntl(fd, F_SETFL, 0);
      printf("Success.\n");
   }

   return(fd);
} // Open sp

void Communicate(void)
{
   struct termios settings;    

   tcgetattr( fd, &settings );

   cfsetispeed(&settings, B9600);    // Set bouds
   cfsetospeed(&settings, B9600);

   settings.c_cflag &= ~PARENB;    // set no parity, stop bits, data bits
   settings.c_cflag &= ~CSTOPB;
   settings.c_cflag &= ~CSIZE;
   settings.c_cflag |= CS8;

   tcflush( fd, TCIFLUSH );

   if (tcsetattr(fd, TCSAFLUSH, &settings)!= 0)
   {
      printf("Error message");
   }   

   //Create byte array
   unsigned char send_bytes[] = { 0x1, 0x6, 0x2, 0xAA, 0x2, 0x3, 0xB8, 0x4 };

   write(fd, send_bytes, sizeof(send_bytes));  // Send data
   printf("Data sent. \n");

   char buffer[64]; // buffer to receive data

   printf("I'm reading data...\n");
   int n = read(fd, buffer, sizeof(buffer));

   if (n < 0)
     printf("Failed to read\n");

   int i; 
   printf("Showing data...\n");

   for(i=0; i<sizeof(buffer); i++)
   {
      printf("Hex: %x\n", buffer[i]);
   } 

   printf("Closing...\n");

   close(fd);

   printf("All done!\n");
}

У меня тут несколько проблем:

  1. После того, как я запускаю программу один раз, она выполняется правильно, но когда я пытаюсь запустить ее снова, она останавливается на «Я читаю данные ...» и не запускается даже после перезагрузки компьютера. Через некоторое время это позволяет мне снова выполнить программу.
  2. После того, как программа вернет данные, она должна отправить мне шестнадцатеричные данные, такие как A7, 9F и т. Д., Но это дает мне целые значения.
  3. Должен ли я и как очистить буферный массив, чтобы освободить память

Кто-нибудь может помочь с этими проблемами?


person user2081328    schedule 26.02.2014    source источник


Ответы (1)


'int n = read(fd, buffer, sizeof(buffer));' возвращает количество байтов, прочитанных в n, которое вы затем игнорируете (кроме проверки отрицательного значения ошибки) и предполагаете, что буфер полностью заполнен. Это ошибка, потому что recv(), как правило, не ожидает запрошенного количества байтов, потому что последовательные порты предоставляют поток байтов, а не «буферы» или «сообщения».

printf("Hex: %x\n", буфер[i]); будут отображать целые числа, потому что вы указываете целые числа с помощью %x. ВНИМАТЕЛЬНО смотрите коды форматов printf.

person Martin James    schedule 26.02.2014
comment
Я не уверен, что правильно понимаю. Мой код не проходит через этот не полностью заполненный исходящий буферный массив, он просто останавливается здесь, поэтому я ничего не могу сделать с n. Кроме того, я не знаю, сколько байтов предоставит порт, просто оно не будет больше 64, поэтому есть ли способ проверить количество байтов, которые я получаю. В программе С# я сделал что-то вроде этого: array[] buf = new array[port.BytesToRead]; порт.читать(буф); - person user2081328; 26.02.2014
comment
Я попытался закомментировать строки с чтением и записью, и программа работает (неправильно, конечно), поэтому кажется, что она не читает и не записывает данные в последовательный порт и обратно. Что не так с моими настройками??? - person user2081328; 26.02.2014