0

我正在尝试从 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是 ),但是那些不包含完整消息的行会发生什么?根据文档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 位中编译。

4

1 回答 1

2

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

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

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

于 2013-10-26T02:01:25.007 回答