我正试图在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位编译。
答案 0 :(得分:2)
发生的事情是ReadFile
在获取任何数据后返回。由于数据可能会在未来的某个时间点出现在串行端口上,因此ReadFile
将在串行端口上获得一定数量的数据时返回。如果您尝试从串行端口read
,在Linux中也会发生同样的事情。您获得的数据可能是也可能不是整行,具体取决于再次调度进程时缓冲区中的信息量。
如果您再看一下文档,请注意它只会在HANDLE
处于控制台模式时返回一行:
通过使用具有控制台输入句柄的ReadFile,可以从控制台输入缓冲区中读取字符。控制台模式确定ReadFile函数的确切行为。默认情况下,控制台模式为ENABLE_LINE_INPUT,表示ReadFile应该读取,直到它到达回车符。如果按Ctrl + C,则调用成功,但GetLastError返回ERROR_OPERATION_ABORTED。有关更多信息,请参阅CreateFile。