使用 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 打印机

如果将笔式驱动器插入 USB 端口,如何使用 c# 检测?

使用 USB 中的扫描仪将图像扫描并存储为 PDF [关闭]

使用 C# 在 USB 上创建多个分区

C# USB视频人脸检测

在 C# 中设置 USB 键盘状态