与C中的Windows 10进行虚拟comport通信

时间:2017-12-10 11:55:03

标签: c readfile

我尝试通过Win10上的虚拟comport(与usb适配器,PL2303配合)与设备进行通信。该设备是Eltek RC250数据记录器。

我已经安装了较旧的PL2303驱动程序。 devicemanager识别设备没有任何错误。在设备和官方软件之间发送和接收数据工作正常。

我的问题是,在执行ReadFile之后,程序什么都不做。我认为ReadFile正在等待来自设备的更多输入,因此坚持使用此功能。 在win7系统上尝试它会遇到同样的问题。

我写给设备的消息是有效的消息。

以下代码显示了通信。

hComm = CreateFile("COM3",                       //port name
    GENERIC_READ | GENERIC_WRITE, //Read/Write
    0,                            // No Sharing
    NULL,                         // No Security
    OPEN_EXISTING,// Open existing port only
    0,            // Non Overlapped I/O
    NULL);        // Null for Comm Devices                                                  /* establish connection to serial port */

if (hComm == INVALID_HANDLE_VALUE)
    printf("Error in opening serial port");
else
    printf("opening serial port successfully");


nNumberOfBytesToWrite = sizeof(message);

resW = WriteFile(
    hComm,
    message,
    nNumberOfBytesToWrite,
    &lpNumberOfBytesWritten,
    NULL);

do
    {
    printf("\nread");
    resR = ReadFile(
        hComm,
        &answer,
        sizeof(lpNumberOfBytesRead),
        &lpNumberOfBytesRead,
        NULL);
        SerialBuffer[i] = answer;
        i++;
    }
while (lpNumberOfBytesRead > 0);

return 0;

请帮助我,我不知道问题可能是什么。 托马斯

1 个答案:

答案 0 :(得分:1)

ReadFile()调用中,第三个参数应该是sizeof(answer)(或者可能只是1,因为它看起来像是一个字节),但肯定不是sizeof(lpNumberOfBytesRead)。当假设DWORD是单个字节时,它阻塞等待4个字节(answer的大小)?

此外,如果您没有明确设置Comm timeout,您不知道ReadFile()在返回0退出循环之前会等待多长时间。如果超时是无限期的,那么它将永远不会存在循环。

此调用中还存在其他潜在问题,但未查看参数的声明方式,则无法说明。