我正在打开一个USB设备:
使用 CreateFile
进行通信:
HANDLE hUsb = CreateFile("\\.\LCLD9",
GENERIC_READ | GENERIC_WRITE,
0,
null,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0);
呼叫成功(即hUsb不等于INVALID_HANDLE_VALUE) . 但是时间到了我们对每个串口做的事情:
-
SetupComm(设置接收和传输缓冲区大小)
-
SetCommState(设置流量控制,波特率等)
-
SetCommTimeouts(设置超时)
每个调用 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 回答
不,USB设备不使用这些东西 . 如果您的设备是实际的USB到RS232(或其他慢速串行),那么您应该打开它所关联的COM端口 . 让驱动程序处理发送数据的工作 .
USB通信与COM端口不同 . 您可以将其视为外部PCI总线,而不是简单的发送 - 无需数据 - 您想要的线路 .
事实证明我不需要对
Comm
做任何事情,因为它不是COM端口 . 我WriteFile
失败的原因是因为我试图写入\\.\LCLD9
而不是\\.\LCLD9\
.尾随反斜杠很关键;即使
CreateFile
双向都能成功 .任何人使用Logic Controls LD9000 USB线路显示器,上面是你如何写入显示器 .
在对其.NET Line Display驱动程序进行逆向工程后,我还会提到您使用的端口名称,例如:
\\.\LCLD9\
\\.\LCPD6\
\\.\LCPD3\
可以从使用Windows安装程序API返回的完整devicePath中推断出 . 例如,我的极点显示器的完整设备路径是:
规则是检查产品ID的设备路径 . 在我的情况下
PID_A090
表示它将作为文件\\.\LCLD9\
提供 . 其他产品ID及其关联的文件路径: