COM端口的设备仿真

时间:2012-03-22 01:05:57

标签: c++ winapi createfile

我有一个将数据发送到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。 我错过了什么?

4 个答案:

答案 0 :(得分:5)

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

我自己使用这种技术,效果很好。当我需要编写与设备通信的应用程序时,我通常会编写一个单独的模拟  为主应用程序生成数据以供阅读的应用程序,并使用主应用程序发送的数据。主应用程序不知道它没有与真实设备通信,因此您不必更改主应用程序中的任何代码以支持模拟

答案 1 :(得分:0)

通过两次打开相同的端口,您无法在串行端口上发送内容。串口有两条不同的物理线,一条用于发送,另一条用于接收。没有任何东西插入端口,这两条线路无处可去,信号不会自动从一个移动到另一个。

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

串口不是IPC管道。如果您想要环回,则必须在驱动程序中模拟,或者您必须启用硬件环回模式。我认为驱动程序阻止了两个句柄在设备上打开,尽管共享标志传递给CreateFile。 (我从来没有能够在Windows上获得两个串行应用程序来打开同一个串口。)

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

我没有在DCB结构中看到任何标志来配置环回,即使像16550 UARTS这样的芯片也有能力。

因此,通过零调制解调器电缆进行外部环回是它。