не может правильно прочитать строку данных, используя последовательный порт Windows в windows.h - PullRequest
0 голосов
/ 20 января 2011

У меня есть микроконтроллер, подключенный к моему порту USB, который я читаю, используя код ниже: *

#include <windows.h>
#include <stdio.h>
#include <conio.h>

int main (void)
{

    int n = 25;
    char szBuff[25 + 1] = {0};

    HANDLE hSerial;
    DCB dcbSerialParams = {0};
    COMMTIMEOUTS timeouts={0};
    DWORD dwBytesRead =25;

    dcbSerialParams.DCBlength=sizeof(DCB);

    hSerial = CreateFile("COM4",
                     GENERIC_READ | GENERIC_WRITE,
                     0,
                     0,
                     OPEN_EXISTING,
                     FILE_ATTRIBUTE_NORMAL,
                     0);


    if(hSerial==INVALID_HANDLE_VALUE)
    {
      if(GetLastError()==ERROR_FILE_NOT_FOUND)
      {
        puts ("cannot open port!");
        return;
      }

      puts ("invalid handle value!");     
      return;                            
    }

    if (!GetCommState(hSerial, &dcbSerialParams)) 
    {
      puts ("error getting state");
      return;
    }

    dcbSerialParams.BaudRate=CBR_57600;
    dcbSerialParams.ByteSize=8;
    dcbSerialParams.StopBits=ONESTOPBIT;
    dcbSerialParams.Parity=NOPARITY;

   if(!SetCommState(hSerial, &dcbSerialParams))
   {
      puts ("error setting port state");
      return;
   }

   timeouts.ReadIntervalTimeout = 30;
   timeouts.ReadTotalTimeoutMultiplier = 100;
   timeouts.ReadTotalTimeoutConstant = 100;

   if (!SetCommTimeouts(hSerial, &timeouts))
   {
      puts ("timeouts setting fail!");
   }

   while (1){      
   if(!ReadFile(hSerial, szBuff, n, &dwBytesRead, NULL)){
      puts ("serial read error fail!");
      return;
   } 

   else
   {
      printf ("%s\n" , szBuff);
   }
   }


   getch();     
   return 0;

}
`

Я отправляю данные в следующем формате: $ ABC $, за которым следует символ новой строки.так что его 7 (или 8, включая перевод строки) правильно?я установил 3-й аргумент для файла чтения на 20, больше чем 7 байтов, чтобы я мог успешно прочитать всю строку данных.однако чтение иногда пропускает несколько символов.вместо чтения $ ABC $ я читаю в одной строке $ ABC и в строке после этого $ (скрытый '\ n').как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 20 января 2011

Это нормально.Когда приемный буфер содержит хотя бы один байт, вы получите обратно все, что находится в буфере.Как правило, это лишь малая часть того, что вы ожидаете, последовательные порты работают довольно медленно.Вы должны будете продолжать читать, пока не получите полный ответ.

0 голосов
/ 25 января 2011

Просто, чтобы добавить к ответу, обязательно используйте какой-то тайм-аут, или вы заблокируете ожидание символа, который может никогда не прийти.

Возможно, одним из вариантов может быть чтение байта на байт, затем просто подождатьпоследний '$' или '\ n' должен знать, что вы получили полную строку, а затем обработать ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...