【问题标题】:Reading from a COM port destroys lines从 COM 端口读取会破坏线路
【发布时间】:2013-10-26 01:49:52
【问题描述】:

我正在尝试从 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),但是那些不包含完整消息的行会发生什么?根据the documentationReadFile 默认应该读取整行。这是不正确的 - 我需要自己缓冲并等待换行符吗?

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

#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 在 64 位 Windows 7 中编译。

【问题讨论】:

    标签: c windows serial-port


    【解决方案1】:

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

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

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

    【讨论】:

    • 对,但它说“默认情况下,控制台模式是 ENABLE_LINE_INPUT”...我读错了,还是我的串行句柄应该默认处于控制台模式?
    • 我对 Windows 的了解还不足以肯定地说,但我认为这段话是说,当你打开控制台时(即stdin)你不会得到任何回报,直到你会得到一个\r。控制台缓冲区与串行缓冲区不同,串行缓冲区是您从中读取数据的地方。
    • 好的,所以我必须检查我每次读取的数据,然后在 PC 上拼凑起来。我能做到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多