使用windows.h中的Windows串行无法正确读取数据字符串

时间:2011-01-20 14:28:05

标签: c windows winapi serial-port

我有一个微控制器连接到我的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;

}
`

我按这种格式发送数据:$ A.B.C $后跟换行符。所以它的7(或8,包括换行)字节对吗?我将readfile的第三个参数设置为20,大于7个字节,这样我就可以成功读取所有数据字符串。然而阅读有时会错过几个字符。而不是阅读$ A.B.C $我在一行$ A.B.C和$ $之后的行中读取(隐藏的'\ n')。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

这很正常。当接收缓冲区包含至少一个字节时,您将返回缓冲区中的任何内容。这通常只是你期望的一小部分,串口很慢。你必须继续阅读,直到你得到完整的回应。

答案 1 :(得分:0)

只是为了添加答案,请确保使用某种类型的超时,否则您将阻止等待可能永远不会到来的角色。

也许一个选项可能是每个字节读取字节然后等待最后一个'$'或'\ n'知道你收到了完整的字符串然后处理它。