从COM端口读取会破坏线路

时间:2013-10-26 01:49:53

标签: c windows serial-port

我正试图在Windows中逐行读取COM端口中的数据。在PuTTY中,COM连接看起来很好 - 我的串行设备(MSP430 Launchpad)每秒输出一次“Data”字符串。但是,当我使用一个简单的C程序来读取COM端口并打印出读取的字节数时,那么数据本身就会被完全破坏:

0
6 Data

2 Data

4 ta


6 Data

3 Data

3 a
a

6 Data

6 Data

2 Data

6 Data的行是正确的(四个字符,然后是\r\n),但是那些不包含完整消息的行会发生什么?根据{{​​3}},ReadFile默认情况下应读取整行。这是不正确的 - 我是否需要自己缓冲它并等待换行字符?

请注意,并非每次运行代码都会出现所有这些错误;我做了几次运行,并为您的观看乐趣编制了各种错误。这是我正在使用的代码:

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

static DCB settings;
static HANDLE serial;
static char line[200];
static unsigned long read;
static unsigned int lineLength = sizeof(line) / sizeof(char);

int main(void) {
   int i = 10;

   serial = CreateFile("COM4",
      GENERIC_READ | GENERIC_WRITE,
      0, NULL,
      OPEN_EXISTING,
      0, NULL);

   GetCommState(serial, &settings);
   settings.BaudRate = CBR_9600;
   settings.ByteSize = 8;
   settings.Parity = NOPARITY;
   settings.StopBits = ONESTOPBIT;
   SetCommState(serial, &settings);

   while(i) {
      ReadFile(serial, &line, lineLength, &read, 0);
      printf("%lu %s\n", read, line);
      i--;
   }
   scanf("%c", &read);

   return 0;
}

使用Visual Studio Express 2012在Windows 7 64位编译。

1 个答案:

答案 0 :(得分:2)

发生的事情是ReadFile在获取任何数据后返回。由于数据可能会在未来的某个时间点出现在串行端口上,因此ReadFile将在串行端口上获得一定数量的数据时返回。如果您尝试从串行端口read,在Linux中也会发生同样的事情。您获得的数据可能是也可能不是整行,具体取决于再次调度进程时缓冲区中的信息量。

如果您再看一下文档,请注意它只会在HANDLE处于控制台模式时返回一行:

  

通过使用具有控制台输入句柄的ReadFile,可以从控制台输入缓冲区中读取字符。控制台模式确定ReadFile函数的确切行为。默认情况下,控制台模式为ENABLE_LINE_INPUT,表示ReadFile应该读取,直到它到达回车符。如果按Ctrl + C,则调用成功,但GetLastError返回ERROR_OPERATION_ABORTED。有关更多信息,请参阅CreateFile。