STM32微控制器的UART通过USB实现传输

4
我正在尝试在STM324x9I-EVAL开发板上通过USB接口实现UART。目的是通过串行发送命令到伺服控制器(或其他硬件)。我已经成功地在开发板上实现了USB_Device_CDC示例,但不确定没有安装驱动程序的PC如何使用此功能。至于其他硬件,USB端口现在是否只是看起来像一个串行端口?还是需要在另一端安装驱动程序或某种接口?我想指出的是,我知道以下帖子:Emulating UART over USB,但我认为我的问题在那个回答的上下文中没有得到完全解答。

好的,如果你想使用USB接口,你需要有两个设备:一个在电缆的每一端。并且两者都必须使用适当的高级协议。你如何将鼠标或键盘连接到PC? - too honest for this site
只是为了明确起见,CDC实现本身并不会使USB看起来像串行端口对其他设备吗?我不能在端口上写入数据并期望UART接口理解它,对吗? - mban
你应该先了解一下USB及其“设备类”,特别是CDC类。这些文档可以免费获取(至少2.0版本时是这样的)。 - too honest for this site
你感到困惑的一部分似乎是你的方案模糊不清。你没有指定哪个设备是USB主机,哪个设备是USB小工具(或“设备”)。"在没有带驱动程序的PC的情况下如何工作" -- 我只见过主机USB端口(即女性Type-A)在PC上。如果你将你的开发板连接到PC上,那么该板就是一个USB小工具。推测 "舵机控制器(或其他硬件)"也是一个USB小工具?为了将你的开发板连接到 "舵机控制器",你需要在开发板上使用一个USB主机端口。 - sawdust
2个回答

6
一个USB连接不像UART一样是点对点连接。它需要一个主机和一个设备之间的主/从关系。设备不能启动数据传输;它必须被主机持续轮询。
CDC/ACM类设备在PC主机上呈现一个虚拟COM端口,但这并不允许设备与UART接口通信。它在软件级别看起来像串行端口,但没有实现UART物理层。在外观上看起来像PC串行端口,但在物理层面上没有任何类似于UART通信的东西。
有些设备可以充当UART/USB桥(例如FTDI和Prolific),您也可以(有点昂贵地)从具有USB设备控制器和UART的微控制器中构建自己的设备,但是该桥是一个USB设备,仍然必须连接到USB主机;通常用于将PC连接到缺乏USB控制器或使用USB控制器的软件/CPU开销过大的微控制器。
理论上,您可以将具有USB主机控制器和USB设备控制器的微控制器连接起来,但是您需要分别在每个控制器上安装主机和设备软件堆栈,而且一旦您拥有了USB连接,实现CDC/ACM是可用带宽的相当低效的利用。 CDC/ACM类的目的主要是允许“传统”软件在PC上工作。
如果您需要连接到“真正”的串行端口,应该使用真正的UART - 它们比任何情况下微控制器上的USB控制器更为普遍。

5
你应该了解一些关于USB设备类的知识。CDC是一个USB设备类,而ACM是我假定你正在使用的一个子类。你制作的设备可以被称为“CDC ACM设备”,因为它使用了CDC类和ACM子类。
这些类和子类是由USB实施者论坛在文件中定义的,你可以在这里找到它们:

http://www.usb.org/developers/docs/devclass_docs/

这些文档规定了 CDC ACM 设备应该具有哪些 USB 描述符来向主机描述自己,以及它应该具有哪些接口和端点,以及串行数据将如何在 USB 事务和传输方面表示。
请注意,CDC ACM 仅指定用于在主机和设备之间传输数据的一些 USB 命令。它不指定设备实际上将对该数据执行什么操作。您可以使用 CDC ACM 实现 USB-串口适配器,或者只是将其用作任何要发送的数据的通用通信接口。
是的,你需要在 PC 端安装驱动程序。驱动程序需要设计为在您特定的操作系统上运行。它需要在操作系统中创建某种虚拟串口设备,其他软件(仅知道串口)可以找到并连接。它需要根据 CDC ACM 规范将其他软件在串口上执行的串口操作(例如向串口写入一些字节)转换为低级别的 USB 命令(例如通过特定的端点以 USB 数据包的形式将一些字节发送到设备)。它需要以某种方式知道应该操作哪些 USB 设备,因为并非每个 USB 设备都是 CDC ACM 设备。
对于Windows操作系统,您可能会使用Windows自带的usbser.sys驱动程序。对于早于Windows 10版本的Windows操作系统,您需要编写一个INF文件将您的设备与usbser.sys关联并签名。对于Windows 10及更高版本的操作系统,已经包含了一个名为usbser.inf的新的INF文件,它将自动匹配任何有效的CDC ACM设备。这意味着,如果您只打算支持在Windows 10或更高版本上使用设备,则无需编写或分发CDC ACM设备的驱动程序。微软和Arduino之间的合作始于2015年,让我相信微软将继续支持和改进usbser.sys。事实上,他们声称在Windows 10中,“该驱动程序已通过使用内核模式驱动程序框架进行了重写,从而提高了驱动程序的整体稳定性”,这是个好消息。

对于Linux系统,有一个cdc_acm内核模块,它已经成为内核的标准部分很长时间了,应该可以自动与插入的任何CDC ACM设备配合使用。

对于Mac OS X系统,有一个AppleUSBCDCACM驱动程序,应该可以自动与插入的任何CDC ACM设备配合使用。

请注意,为了使这些驱动程序识别您的设备并与其配合使用,您的设备必须在其USB描述符中具有某些值,并且要求可能因您所讨论的确切驱动程序版本而异。

现在,USB端口是否会像串行端口一样简单?

不,那是错误的想法。USB端口仍将看起来像USB端口,但操作系统提供的各种USB驱动程序将识别插入该端口的CDC ACM设备,并在操作系统的串行端口列表中创建一个新条目。然后,如果您运行一些只知道串行端口的软件,它可以连接到该端口。实际上,如果您制作一个复合设备,您可以将单个USB设备插入单个USB端口,实际上具有两个或更多虚拟串行端口。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接