通过 USB 模拟 UART

Posted

技术标签:

【中文标题】通过 USB 模拟 UART【英文标题】:Emulating UART over USB 【发布时间】:2012-09-22 14:56:08 【问题描述】:

有人知道是否可以(简单的串行发送和接收)吗?这将如何实现?

我在 Microchip 网站上找到了这个链接,但不是很及时。

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

有什么想法吗?谢谢。

【问题讨论】:

绝对使用 FTDI 是最好的方法。 FTDI?请解释。我的经理要求我将集成 USB 外设配置为作为 UART 运行。据我所知,这是不可能的,但他坚持认为是。 FTDI 芯片将 UART 转换为 USB。因此,在内部您只需使用普通的 UART 外围设备,但在外部则使用 USB 插入。在 PC 端,您将获得一个虚拟 COM 端口,因此您可以与它作为普通串行端口进行交互。这是非常干净和容易的,每个人都这样做。我无法想象为什么您真的需要使用芯片的 USB 外围设备。 @JimFell:你可能在问之前已经谷歌了:ftdichip.com @TJD:使用片上外设的原因:为了量产,成本更低,电路板空间更小。另一方面,对于小批量和一次性的,除非您已经拥有 USB VID 和代码签名证书,否则它不具有成本效益,并且会带来高 CPU 开销 - 只需将 USB 线连接到 PC 就会产生 1ms 的中断率,以及数据传输期间的更多内容。 【参考方案1】:

您需要将设备堆栈实现为 CDC ACM 设备(也称为 虚拟 COM 端口或 VCP)。大多数支持 USB 的微控制器供应商都有示例代码或应用说明。

鉴于此,就 Windows 而言,您的设备看起来就像一个 COM 端口。在设备端,您将获得传输的原始数据块。可以为 UART 和 USB 接口实现适当的抽象层,以便在必要时提供相同的接口。

一个问题是 USB 设备需要一个由 USB 实施者论坛分配的供应商 ID,地址为 $5000 fee(正确,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 更新自动获取。

所以结果是,如果您的供应商已经提供了代码和签名的驱动程序(或者您没有使用 Windows),那么您可以进行实验,但要部署产品,您需要供应商 ID 和代码签名证书.老实说,这有点雷区。

更简单的方法是使用 FTDI USB串行芯片。这对于没有自己的 USB 控制器的微控制器特别有用,但数据传输速率将受到微型和/或 FTDI 的 UART 接口而不是 USB 速度的限制。 FTDI 芯片可以使用 FTDI 的 VID/PID 原样使用,或者您可以使用自己的 VID/PID 对其进行自定义。自定义使您重新需要获取 VID 和签名证书,但允许您的设备被唯一标识,而不是作为通用串行端口。

【讨论】:

我要补充一点:避免使用任何基于 PL2303 的 USB 串行加密狗 - 芯片组本身看起来很脆弱,Windows 和 MacOSX 的驱动程序都不可靠。调试嵌入式硬件时真是个坏消息,并且您依赖串行端口进行调试。 我可以保证使用 PL2303 适配器在 Windows 上出现问题。如果多个适配器上的数据过多,则会出现蓝屏等问题。此外,我使用的这些适配器的几个变体在 Linux 下运行良好。 我对使用使用 FTDI USB 转串行芯片的板很感兴趣,想知道它如何与 STM32 微控制器的 USB 端口连接。我想知道如何从微控制器的角度与它进行通信。根据我的理解(我承认这是有限的),为了让 micro 将其识别为 VCP,它需要 FTDI VCP 驱动程序。我不确定是否可以在 STM32 micro 上安装它,并希望看看是否有任何替代方案可以通过 USB 与开发板连接。 @mban :如果您对此有任何疑问,您应该发布一个问题 - 这不是一个讨论论坛。然而 FTDI 芯片用于将 UART I/O 桥接到 USB;您可以直接使用 STM32 USB 控制器连接到 STM32 UART 的 FTDI。微控制器不需要任何软件即可与 FTDI 配合使用;这就是 FTDI 的重点——您只需使用 UART。 ST 为片上 USB 控制器提供 USB 软件,作为其 (Cube)[st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/… 软件包的一部分。 @marko :自撰写以来,Prolific 似乎已经改善了 Windows 驱动程序的情况 - 现在通过了 WHQL 并可通过 Windows 更新获得。 2012 年普遍存在的问题似乎不再出现。然而,似乎确实有一些旧的或假冒的 PL2303 设备现在完全拒绝使用“官方”驱动程序在 Windows 8/10 上工作。【参考方案2】:

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

    使用现有产品。 FTDI 公司提供众所周知且可靠的 UART-USB 桥接芯片,例如FT230X。优点:您不需要任何有关 USB 的详细知识。缺点:如果用于大规模生产,价格会很高。额外的硬件,需要额外的电源。

    实现 USB 设备类“通信设备类”(CDC)。 CDC 的规范可从 USB.org 获得,请参阅 here。优点:批量生产便宜(如果您的微控制器板载 USB)。缺点:您需要有关 USB 的详细知识。

【讨论】:

简单,切中要害。事实证明,我的经理正在谈论实现虚拟 COM 端口。谢谢! 链接已损坏。现在应该在这里吗? usb.org/developers/docs @cp 工程师:感谢您的提示。您的链接指向正确的方向。再深入一步,您将来到可找到 CDC 规范的 USB 类规范:www.usb.org/developers/docs/devclass_docs/。

以上是关于通过 USB 模拟 UART的主要内容,如果未能解决你的问题,请参考以下文章

Android Things:在 Raspberry PI 3 上通过 USB UART 接收数据时出现 NullPointerException

PIC32MZ 通过USB在线升级 -- USB HID bootloader

STM32f103 HAL USB - UART桥接器

使用 UART 从 Raspberry Pi 编程 Arduino

atmel 模拟 UART 通讯

uart通讯协议