我正在尝试从 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 位中编译。