使用 C# 通过“USB 虚拟串行端口”与 USB 设备通信?
Posted
技术标签:
【中文标题】使用 C# 通过“USB 虚拟串行端口”与 USB 设备通信?【英文标题】:Communicating with an USB device over “USB Virtual Serial Port” using C#? 【发布时间】:2013-11-02 11:16:16 【问题描述】:我最近使用普通 USB 电缆将 USB 嵌入式设备 (mbed lpc1768) 插入到 Windows 7 桌面。根据在设备上运行的程序附带的文档,它通过 USB 虚拟串行端口与主机(桌面)通信。
如果我需要使用 c# 读取/写入数据,我应该从哪里开始?我可以使用 SerialPort .NET 类还是需要使用 LibUsbDotNet 库或其他东西?
【问题讨论】:
【参考方案1】:当我发现 USB 设备在 VCP 而不是 USB-HID 中通信时,这是个好消息,因为串行连接很容易理解。
如果设备在VCP
(虚拟通信端口)中运行,那么它就像使用System.IO.Ports.SerialPort
类型一样简单。您将需要了解有关设备的一些基本信息,其中大部分可以从 Windows 管理(设备管理器)中收集。像这样构建之后:
SerialPort port = new SerialPort(portNo, baudRate, parity, dataBits, stopBits);
你may or may not需要设置一些额外的标志,例如Request to send (RTS)和Data Terminal Ready (DTR)
port.RtsEnable = true;
port.DtrEnable = true;
然后,打开端口。
port.Open();
要监听,您可以将事件处理程序附加到port.DataReceived
,然后使用port.Read(byte[] buffer, int offset, int count)
port.DataReceived += (sender, e) =>
byte[] buffer = new byte[port.BytesToRead];
port.Read(buffer,0,port.BytesToRead);
// Do something with buffer
;
要发送,您可以使用port.Write(byte[] buffer, int offset, int count)
【讨论】:
在哪里可以看到 portNo(端口名称)? SerialPort.GetPortNames 返回 0 个端口。 就我而言,我不知道端口号,因为它可能并不总是相同。我使用ManagementObjectSearcher
来查找设备(因为我知道名称),所以我使用var searcher = new ManagementObjectSearcher("SELECT * FROM WIN32_SERIALPORT")
并遍历searcher.Get()
中的ManagementBaseObject
集合。我会把它变成答案。
好吧,看来我需要为 Windows 安装 Mbed 串行端口驱动程序(mbed.org/handbook/Windows-serial-configuration)。我运行了它,计算机喘着粗气了几分钟,终于在设备管理器中生成了一个漂亮的“mbed 串行端口 (COM3)”行! :) 我会试试的。
好吧,如果是这样的话,现在,您可以懒惰地将PortNo
硬编码为"COM3"
RtsEnable 和 DtrEnable 在我的情况下是必需的。 +1以上是关于使用 C# 通过“USB 虚拟串行端口”与 USB 设备通信?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 USB 使用 C# 将原始 IPL 发送到 intermec pm4i 打印机