首页 文章

SetupComm,SetCommState,SetCommTimeouts因USB设备而失败

提问于
浏览
1

我正在打开一个USB设备:

enter image description here

使用 CreateFile 进行通信:

HANDLE hUsb = CreateFile("\\.\LCLD9",
      GENERIC_READ | GENERIC_WRITE, 
      0, 
      null, 
      OPEN_EXISTING, 
      FILE_FLAG_OVERLAPPED, 
      0);

呼叫成功(即hUsb不等于INVALID_HANDLE_VALUE) . 但是时间到了我们对每个串口做的事情:

每个调用 GetLastError 代码为 1 . 例如 . :

SetupComm(hUsb, 1024, 1024);

为什么在使用"USB"串行设备时配置串行设备的操作失败,但在使用"virtual COM port"时有效? USB设备不支持这样的波特率,缓冲区,流量控制和超时吗?

如果这是通用串行设备的限制/功能,我如何检测句柄是指"Universial Serial Device",而不是"COMM Port"?例如,用户是指定使用哪个端口的用户:

  • \ . \ COM5

  • \ . \ LCLD9


与通用串行总线串行设备通信时失败的其他串行功能:

  • GetCommModemStatus(错误代码1)

  • ReadFile (错误代码6)

  • PurgeComm (错误代码6)

  • WriteFile (错误代码6)

这引出了一个更大的问题,一旦用USB设备打开 CreateFile ,你如何与USB通信?

2 回答

  • 2

    不,USB设备不使用这些东西 . 如果您的设备是实际的USB到RS232(或其他慢速串行),那么您应该打开它所关联的COM端口 . 让驱动程序处理发送数据的工作 .

    USB通信与COM端口不同 . 您可以将其视为外部PCI总线,而不是简单的发送 - 无需数据 - 您想要的线路 .

  • 4

    事实证明我不需要对 Comm 做任何事情,因为它不是COM端口 . 我 WriteFile 失败的原因是因为我试图写入 \\.\LCLD9 而不是 \\.\LCLD9\ .

    尾随反斜杠很关键;即使 CreateFile 双向都能成功 .

    void WriteToDisplay(String s)
    {
       //Open the display
       var hLineDisplay = CreateFile("\\.\LCLD9\", GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0);
    
       //Write the command
       DWORD bytesWritten;
       WriteFile(hLineDisplay, s, s.Length, ref bytesWritten, nil);
    
       FileClose(hLineDisplay);
    }
    

    任何人使用Logic Controls LD9000 USB线路显示器,上面是你如何写入显示器 .

    在对其.NET Line Display驱动程序进行逆向工程后,我还会提到您使用的端口名称,例如:

    • \\.\LCLD9\

    • \\.\LCPD6\

    • \\.\LCPD3\

    可以从使用Windows安装程序API返回的完整devicePath中推断出 . 例如,我的极点显示器的完整设备路径是:

    \\?\USB#VID_0FA8&PID_A090#6&DF2EE03&0&1#{A5DCBF10-6530-11D2-901F-00C04FB951ED}
                     \______/
                        |
                    ProductID
    

    规则是检查产品ID的设备路径 . 在我的情况下 PID_A090 表示它将作为文件 \\.\LCLD9\ 提供 . 其他产品ID及其关联的文件路径:

    Contains  DeviceName (trailing backslash is not optional)
    ========  ===============================================
    PID_A030  \\.\LCPD3\
    PID_A060  \\.\LCPD6\
    PID_A090  \\.\LCLD9\
    

    注意:任何代码都会发布到公共域中 . 无需归属 .

相关问题