读取后 COM 端口无法写入

COM port won't write after reading

本文关键字:COM 读取      更新时间:2023-10-16

我是C++和COM端口的新手,我花了几天时间试图理解这篇文章,这篇文章一页又一页地让我不知所措。我只想得到一个基本的,简单的例子运行,呼叫和回答。

我正试图让一个"客户端"C++应用程序通过COM端口连接将数据发送到"服务器",然后让"服务器"通过同一端口回复。这可能是一个阻塞操作,所以除非我需要,否则我不会陷入重叠或线程之类的问题,这些问题甚至让我难以想象。但这个片段是我目前在"服务器"中拥有的内容的一部分:

UInt8 InputBuffer[2000];
UInt8 value = 130;
UInt8 * intBuffer = &value;
DWORD BytesRead, BytesWritten;
cout << "Trying to read in listen mode" << endl;
ReadFile(SerialHandle, InputBuffer, 1, &BytesRead, NULL);
cout << "Read " << BytesRead << " bytes; will try to write back" << endl;
if (!WriteFile(SerialHandle, intBuffer, 1, &BytesWritten, NULL)) {
    cout << "Error writing this content." << endl;
} else {
    cout << "Wrote back " << BytesWritten << " bytes" << endl;
    cout << "With error: " << GetLastError() << endl;
}

以下是串行端口句柄设置(此处为"COM6",使用虚拟COM端口的其他应用程序中为"COM7"):

SerialHandle = CreateFile(
    L"COM6",
    GENERIC_READ | GENERIC_WRITE,
    FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
    NULL,
    OPEN_EXISTING,
    0,
    NULL);

两个应用程序的DCB设置也是相同的,因此波特率等应该匹配。

我被卡住了,因为我认为SerialHandle设置正确。ReadFile(...)工作,下面的cout打印的正是我所期望的。但是,WriteFile尝试之后的if ... else报告它写回了0个字节,但有0个错误。

为什么它读而不写?如果我错过了一些基本的东西,很抱歉,但我花了好几天的时间试图让这个简单的东西发挥作用,现在却失去了理智。作为健全性检查,我在C#中有一个工作版本,但我一辈子都无法在C++中工作。

两种应用程序的DCB设置也是相同的,因此波特率等应与匹配

不一定。如果使用GetCommState(),则应用程序会受到端口上已配置的设置的影响,而这两个端口上的设置可能不相同。

因此,我建议不要使用GetCommState(),而是自己设置所有参数。