我正在打开一个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);
为什么业务配置串行设备使用“虚拟COM端口”时使用“USB”串行设备,但工作的时候会失败? 不要USB设备不支持这样的波特率,缓冲区,流控制,以及超时?
如果这是通用串行设备的限制/功能,我怎么可以检测到手柄是指“Universial串行设备”,而不是“COMM端口”? 例如,用户是谁指定要使用的端口之一:
交谈通用串行总线串行设备时失败等系列功能:
-
GetCommModemStatus
(错误代码1) -
ReadFile
(错误代码6) -
PurgeComm
(错误代码6) -
WriteFile
(错误代码6)
这引出了一个更大的问题,一旦它被打开与USB设备你怎么沟通CreateFile
?
不,USB设备不使用这些东西。 如果您的设备是一个实际的USB转RS232(或其他低速串行),那么你应该打开它与相关的COM端口。 让司机处理发送数据的工作。
USB通讯不像COM端口。 你可以认为它更像一个外部的PCI总线不是一个简单的发送,任何数据 - 你想学系。
原来我没有与做任何事情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);
}
任何使用逻辑控制LD9000 USB线显示,上面的是你如何写的显示。
逆向工程的.NET行显示驱动程序后我还会提到,您使用的端口,如名称:
-
\\.\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\
注意 :任何代码发布到公共领域。 无需归属。