通过USB模拟UART

8

有没有人知道是否可以通过USB模拟UART(简单的串行传输和接收)?如何实现?

我在Microchip网站上找到了这个链接,但它并没有提供太多信息。

http://www.microchip.com/forums/m522571-print.aspx

有什么想法吗?谢谢。


4
使用FTDI绝对是最佳选择。 - TJD
FTDI是什么?请解释一下。我的经理要求我将集成的USB外设配置为UART操作。据我所知,这似乎是不可能的,但他坚持认为可以。 - Jim Fell
FTDI芯片将UART转换为USB。因此,在内部,您只需使用普通的UART外设,但在外部,您可以使用USB插头。在PC端,您会得到一个虚拟COM端口,以便您可以像使用普通串行端口一样与其交互。这非常干净和简单,也是每个人都使用的方式。我无法想象为什么您真正需要使用芯片的USB外设。 - TJD
@JimFell:在提问之前,你可能已经通过谷歌搜索了这个链接:http://www.ftdichip.com/ - Clifford
@TJD:使用芯片上的外设的原因:对于大量生产,成本和电路板空间较少。 另一方面,对于低数量和单次制品,除非您已经拥有USB VID和代码签名证书,否则不具备成本效益,并且带有高CPU开销 - 仅将USB线连接到PC会生成1ms中断率,并在数据传输期间更多。 - Clifford
你使用的是什么微控制器?以及用的是什么开发工具链?这可能会影响现有库、示例和应用笔记的可用性。 - Clifford
2个回答

13
你需要将设备堆栈实现为CDC ACM设备(也称为虚拟COM端口或VCP)。大多数带USB支持的微控制器供应商都有示例代码或应用笔记。因此,对于Windows来说,你的设备看起来像一个COM端口。在设备端,你将得到传输的原始数据块。如果必要,可以为UART和USB接口实现适当的抽象层,以便给它们相同的接口。一个需要注意的问题是,USB设备需要由USB实施者论坛分配的供应商ID,费用为$5000(截至2016年7月23日)。如果你要在市场上发布你的设备,如果你的设备要被其他设备正确识别并正常工作,你确实需要这个ID。一些微控制器供应商可能允许你免费或以较小的费用使用他们的供应商ID的子集,但他们可能只会在你从他们那里购买了大量设备时才会这样做。
另一个问题是,尽管在OSX或Linux上可以识别CDC / ACM而无需任何其他驱动程序,但Windows更加挑剔,需要一个INF文件将特定的USB供应商和产品ID与usbser.sys驱动程序相关联。然后你会涉及到整个驱动程序签名世界,这对于使用Windows Vista 64或任何版本的Windows 7至关重要。代码签名证书也需要花费一定的费用。如果您的供应商提供了示例VCP代码,他们可能还会提供已签名的驱动程序。 STMicroelectronios的STM32 VCP示例甚至经过WHQL认证,因此可以通过Windows Update自动获取。

因此,归根结底,对于实验,如果您的供应商已经提供了代码和已签名的驱动程序(或者您没有使用Windows),则可以进行实验,但要部署产品,您将需要供应商ID和代码签名证书。老实说,这有点棘手。

一个更简单的方法是使用FTDI USB<->Serial芯片。这对于没有自己的USB控制器的微控制器特别有用,但数据传输速率将受限于微控制器和/或FTDI的UART接口而不是USB速度。可以使用FTDI芯片使用FTDI的VID / PID,也可以使用自己的VID / PID进行定制。定制会让你需要获取VID和签名证书,但允许您的设备被唯一地识别,而不是作为通用串行端口。

3
我要补充一点:避免使用基于PL2303芯片的任何USB-串口转换器 - 这个芯片本身似乎不太可靠,而且Windows和MacOSX的驱动程序也不可靠。当你依赖串口进行嵌入式硬件调试时,这是非常糟糕的消息。 - marko
2
我可以证明在Windows系统中使用PL2303适配器会出现问题。如果有太多数据在多个适配器上,可能会出现蓝屏等情况。而我使用过的这些适配器的几个变种在Linux下运行得非常好。 - Chris Morgan
我有兴趣使用一个利用FTDI USB-to-Serial芯片的板子,并想知道它如何与STM32微控制器的USB端口进行接口。我想知道如何从微控制器的角度与它通信。据我了解(我承认我的了解有限),为了使微控制器将其识别为VCP,它需要FTDI VCP驱动程序。我不确定是否可能在STM32微控制器上安装此驱动程序,并希望看看是否有任何替代方法可以通过USB与该板进行接口。 - mban
@mban:如果您有关于此问题的疑问,应该发布一个问题 - 这不是讨论论坛。然而,FTDI芯片用于将UART I/O桥接到USB;您可以直接使用STM32 USB控制器连接到STM32 UART的FTDI。微控制器不需要任何软件即可与FTDI配合使用;这正是FTDI的目的 - 您只需使用UART即可。ST为芯片上的USB控制器提供USB软件,作为他们(Cube)包的一部分。 - Clifford
@marko: 自从写作以来,Prolific似乎已经改善了Windows驱动程序的情况-现在通过WHQL,并可以通过Windows Update获取。2012年普遍存在的问题似乎不再发生。然而,现在似乎有许多旧的或假的PL2303设备,即使使用“官方”驱动程序也拒绝在Windows 8/10上工作。 - Clifford
多个微控制器供应商(以及FTDI)将为您分配一个PID与他们的VID一起使用,只要您销售/分发的数量少于10,000个单位。 - cp.engr

11

基本上,您有两种选择来模拟UART通过USB:

  1. 使用现有产品。公司FTDI提供了众所周知和可靠的UART-USB桥接芯片,例如FT230X。优点:您不需要关于USB的任何详细知识。缺点:如果在批量生产中使用,则价格昂贵。需要额外的硬件,并且需要额外的电源。

  2. 实现USB设备类“通信设备类”(CDC)。 CDC的规范可从USB.org获得,请参见此处。 优点:在大规模生产中便宜(如果您的微控制器具有USB)。 缺点:您需要对USB有详细的了解。


简单明了。原来我的经理是在谈论实现虚拟COM端口。谢谢! - Jim Fell
链接已损坏。现在应该是在这里吗?http://www.usb.org/developers/docs/ - cp.engr
1
@cp engr:感谢您的提示。您提供的链接指向了正确的方向。再深入一步,您将会找到USB类规范,其中包含CDC规范:www.usb.org/developers/docs/devclass_docs/ - Habi

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