Windows SetupComm、SetCommState、SetCommTimeouts在USB设备上失败

Windows SetupComm、SetCommState、SetCommTimeouts在USB设备上失败,windows,serial-port,usb,createfile,Windows,Serial Port,Usb,Createfile,我正在打开USB设备: 对于使用CreateFile进行通信: HANDLE hUsb = CreateFile("\\.\LCLD9", GENERIC_READ | GENERIC_WRITE, 0, null, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0); 调用成功(即hUsb不等于无效的\u句柄\u值)。但接下来,我们需要对每个串行端口执行以下操作: (设置接收和传

我正在打开USB设备:

对于使用
CreateFile
进行通信:

HANDLE hUsb = CreateFile("\\.\LCLD9",
      GENERIC_READ | GENERIC_WRITE, 
      0, 
      null, 
      OPEN_EXISTING, 
      FILE_FLAG_OVERLAPPED, 
      0);
调用成功(即hUsb不等于无效的\u句柄\u值)。但接下来,我们需要对每个串行端口执行以下操作:

  • (设置接收和传输缓冲区大小)
  • (设置流量控制、波特率等)
  • (设置超时)
使用
GetLastError
code of
1
进行的每个调用。例如:

SetupComm(hUsb, 1024, 1024);
为什么在使用“USB”串行设备时配置串行设备的操作失败,而在使用“虚拟COM端口”时工作?USB设备不支持波特率、缓冲区、流量控制和超时吗

如果这是通用串行设备的一个限制/功能,我如何检测到句柄指的是“通用串行设备”,而不是“通信端口”?例如,指定使用哪个端口的用户:

  • \第五章
  • \LCLD9

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

  • (错误代码为1)
  • ReadFile
    (错误代码为6)
  • purgecom
    (错误代码为6)
  • WriteFile
    (错误代码为6)

这就引出了一个更大的问题,当USB设备被
CreateFile
打开后,您如何与它通信?

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


USB通信不像COM端口。你可以把它看作是一个外部PCI总线,而不是一个简单的发送你想要的任何数据的线路。

不,USB设备不使用这些东西。如果您的设备是实际的USB-to-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 Line显示驱动程序进行反向工程后,我还将提到您使用的端口名称,例如:

  • \\.\LCLD9\
  • \\.\LCPD6\
  • \\.\LCPD3\
可以从使用Windows安装程序API返回的完整devicePath推断。例如,my pole display的完整设备路径为:

\\?\USB#VID_0FA8&PID_A090#6&DF2EE03&0&1#{A5DCBF10-6530-11D2-901F-00C04FB951ED}
                 \______/
                    |
                ProductID
规则是检查产品ID的设备路径。在我的例子中,
PID\u A090
意味着它将作为文件
\.\LCLD9\
提供。其他产品ID及其关联的文件路径:

Contains  DeviceName (trailing backslash is not optional)
========  ===============================================
PID_A030  \\.\LCPD3\
PID_A060  \\.\LCPD6\
PID_A090  \\.\LCLD9\
注意:任何代码都会发布到公共域中。无需归因


事实证明,我不必对
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 Line显示驱动程序进行反向工程后,我还将提到您使用的端口名称,例如:

  • \\.\LCLD9\
  • \\.\LCPD6\
  • \\.\LCPD3\
可以从使用Windows安装程序API返回的完整devicePath推断。例如,my pole display的完整设备路径为:

\\?\USB#VID_0FA8&PID_A090#6&DF2EE03&0&1#{A5DCBF10-6530-11D2-901F-00C04FB951ED}
                 \______/
                    |
                ProductID
规则是检查产品ID的设备路径。在我的例子中,
PID\u A090
意味着它将作为文件
\.\LCLD9\
提供。其他产品ID及其关联的文件路径:

Contains  DeviceName (trailing backslash is not optional)
========  ===============================================
PID_A030  \\.\LCPD3\
PID_A060  \\.\LCPD6\
PID_A090  \\.\LCLD9\
注意:任何代码都会发布到公共域中。无需归因


那么,如何与USB设备通信呢<代码>创建文件
WriteFile
?,
ReadFile
?@i您是否使用了驱动程序。如何使用该驱动程序取决于设备类型和驱动程序。那么,如何与USB设备通信<代码>创建文件
WriteFile
?,
ReadFile
?@i您是否使用了驱动程序。如何使用该驱动程序取决于设备类型和驱动程序。是的,您的设备可能显示为USB设备,但也可能显示COM端口。在“端口”下查看设备管理器,您可能会看到与USB接口关联的COM端口,前提是您安装了正确的驱动程序。是的,您的设备可能显示为USB设备,但也会显示COM端口。在“端口”下查看设备管理器,您可能会看到与USB接口关联的COM端口,前提是您安装了正确的驱动程序。我和您有相同的问题。我可以获得devicePath,但我不明白你在哪里找到有关DeviceName(\\.\LCLD9)的信息?@lads我查看了他们的.NET驱动程序的源代码。最后,它仍然需要返回并调用本机Win32 api函数。我只是用他们的源代码作为文档。我和你有同样的问题。我可以获得devicePath,但我不明白你在哪里找到有关DeviceName(\\.\LCLD9)的信息?@lads我查看了他们的.NET驱动程序的源代码。最后,它仍然必须这样做