COM端口上的设备模拟

Device simulation on COM port

本文关键字:模拟 COM      更新时间:2023-10-16

我有一个向COM端口发送数据的设备。我想在它没有插入时模拟这个设备。我认为只需将数据发送到特定的COM端口即可实现:

int main() {
    char *port = "\\.\COM40";
    HANDLE hCom = CreateFile(port, GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    if (hCom==INVALID_HANDLE_VALUE) return 0;
    DWORD writeBytes;
    int buffer = 0xDEADBEAF;
    BOOL success = WriteFile(hCom, &buffer, 4, &writeBytes, NULL);
    FlushFileBuffers(hCom);
    Sleep(1000);
    HANDLE hCom2 = CreateFile(port, GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    if (hCom2==INVALID_HANDLE_VALUE) return 0; // Exit. GetLastError() == 5
    DWORD readBytes;
    success = ReadFile(hCom2, &buffer, 4, &readBytes, NULL);
    CloseHandle(hCom);
    CloseHandle(hCom2);
    return 0;
}

不幸的是,这不起作用,第二个CreateFile()将最后一个错误设置为ERROR_ACCESS_DENIED。我错过了什么?

对于模拟,请安装虚拟COM端口驱动程序,如com0com。然后,您可以定义驱动程序中链接在一起的2个COM端口。不需要硬件。写入一个端口的任何内容在另一个端口上都是可读的。然后,您可以通过对CreateFile()的单独调用打开每个端口的句柄。

我自己也用这个技巧,效果很好。当我需要编写一个与设备通信的应用程序时,我通常会编写一个单独的模拟生成供主应用程序读取的数据并消耗主应用程序发送的数据的应用程序。主应用程序不知道它没有与真实设备通信,所以你不必更改主应用程序中的任何代码来支持模拟.

不能通过两次打开同一个端口在串行端口上发送东西。串行端口有两条不同的物理线,一条用于传输,另一条用于接收。由于端口上没有插入任何东西,这两条电线将无法连接,信号也不会自动从其中一条移动到另一条。

话虽如此,可以构建一个将TX和RX引脚连接在一起的加密狗,并接收您写入的相同字节。不过,这是一个物理组件,你不能只在软件中完成(好吧,除非你创建了一个"环回设备"COM端口驱动程序,它甚至不需要与硬件对话)。

快速谷歌搜索表明,物理加密狗和环回驱动程序都不难获得。

您可以使用两个不同的COM端口进行此测试。使用一个作为设备模拟器,另一个作为主机系统接收数据。这样就不必在同一个端口上CreateFile两次。

串行端口不是IPC管道。如果你想要环回,要么必须在驱动程序中模拟,要么必须启用硬件环回模式。我认为驱动程序正在阻止设备上的两个句柄打开,尽管共享标志已传递给CreateFile。(我从来没能让Windows上的两个串行应用程序都打开同一个串行端口。)

http://msdn.microsoft.com/en-us/library/ms810467.aspx

我在DCB结构中看不到任何用于配置环回的标志,即使像16550 UARTS这样的芯片具有这种功能。

因此,可以通过零调制解调器电缆进行扩展环回。