用于 STM32 微控制器的 UART over USB
UART over USB for STM32 Micro-controller
我正在尝试通过 STM324x9I-EVAL 开发板上的 USB 接口实现 UART。目的是将命令串行发送到伺服控制器(或其他硬件)。我已经在开发板上成功实现了 USB_Device_CDC 示例,但我不确定在没有另一端带有驱动程序的 PC 的情况下它究竟如何工作。就其他硬件而言,USB口现在会不会像串口一样简单?或者在另一端是否仍然需要驱动程序或某种接口?
我确实想指出我知道以下内容 post:
Emulating UART over USB
但我不认为我的问题在该答案的上下文中得到了完整的回答。
USB 连接不像 UART 那样是点对点连接。它需要主机和设备处于 master/slave 关系。设备无法发起数据传输;它必须由主机连续轮询。
A CDC/ACM class 设备在 PC 主机上提供了一个 虚拟 COM 端口 ,但这不允许设备与 UART 接口通信.它在软件层面看起来像一个串行端口,但没有实现 UART 物理层。为了使它看起来像 PC 串行端口,在引擎盖下进行了很多工作,但 none 它类似于物理级别的 UART 通信。
有些设备充当 UART/USB 桥接器(例如来自 FTDI 和 Prolific),您可以(有点昂贵)从具有 USB 设备控制器和 UART 的微控制器构建自己的设备,但是桥接器是一个 USB 设备并且仍然必须连接到一个 USB 主机;这些通常用于将 PC 连接到缺少 USB 控制器或使用 USB 控制器的 software/CPU 开销太大的微控制器。
从理论上讲,您可以将具有 USB 主机控制器的微控制器连接到具有 USB 设备控制器的微控制器,但是您需要分别在每个主机和设备软件堆栈上,一旦建立了 USB 连接,实现 CDC/ACM 是对可用带宽的低效使用。 CDC/ACM class 的目的主要是让 "legacy" 软件可以在 PC 上运行。
如果您需要连接到 "real" 串行端口,您应该使用真正的 UART - 在任何情况下,它都比微控制器上的 USB 控制器更普遍。
您应该稍微了解一下 USB 设备 classes。 CDC 是 USB 设备 class,ACM 是我假设您正在使用的 subclass。您制作的设备可以称为 "CDC ACM device",因为它使用 CDC class 和 ACM subclass.
这些 classes 和 subclasses 由 USB Implementers Forum 在文档中定义,您可以在此处找到:
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 版本,您需要编写 Windows 10 "the driver has been rewritten by using the Kernel-Mode Driver Framework that improves the overall stability of the driver" 中的 INF file to associate your device to usbser.sys and sign it. For Windows 10 and later, there is a new INF file called usbser.inf already included with Windows which will automatically match any valid CDC ACM device. This means you don't have to write or distribute a driver for CDC ACM devices if you only intend to support using the device on Windows 10 or later. The partnership between Microsoft and Arduino which began in 2015 gives me hope that Microsoft will continue supporting and improving usbser.sys in the future. In fact, they claim,这是个好消息。
对于 Linux,有 cdc_acm 内核模块,它长期以来一直是内核的标准部分,应该可以自动与您插入的任何 CDC ACM 设备一起工作。
对于 Mac OS X,有 AppleUSBCDCACM 驱动程序,它应该可以自动与您插入的任何 CDC ACM 设备一起工作。
请注意,要使这些驱动程序中的任何一个能够识别您的设备并使用它,您的设备必须在其 USB 描述符中具有特定值,并且要求可能会有所不同,具体取决于您所谈论的确切驱动程序版本。
Will the USB port now simply look like a serial port?
不,这是错误的思考方式。 USB 端口仍然看起来像 USB 端口,但操作系统提供的各种 USB 驱动程序将识别 CDC ACM 设备插入该端口并在操作系统的串行端口列表中创建一个新条目。那么如果你运行一些只知道串行端口的软件,它可以连接到那个端口。
事实上,如果您制作一个复合设备,您可以将一个 USB 设备插入一个实际上有两个或更多虚拟串行端口的 USB 端口。
我正在尝试通过 STM324x9I-EVAL 开发板上的 USB 接口实现 UART。目的是将命令串行发送到伺服控制器(或其他硬件)。我已经在开发板上成功实现了 USB_Device_CDC 示例,但我不确定在没有另一端带有驱动程序的 PC 的情况下它究竟如何工作。就其他硬件而言,USB口现在会不会像串口一样简单?或者在另一端是否仍然需要驱动程序或某种接口?
我确实想指出我知道以下内容 post:
Emulating UART over USB
但我不认为我的问题在该答案的上下文中得到了完整的回答。
USB 连接不像 UART 那样是点对点连接。它需要主机和设备处于 master/slave 关系。设备无法发起数据传输;它必须由主机连续轮询。
A CDC/ACM class 设备在 PC 主机上提供了一个 虚拟 COM 端口 ,但这不允许设备与 UART 接口通信.它在软件层面看起来像一个串行端口,但没有实现 UART 物理层。为了使它看起来像 PC 串行端口,在引擎盖下进行了很多工作,但 none 它类似于物理级别的 UART 通信。
有些设备充当 UART/USB 桥接器(例如来自 FTDI 和 Prolific),您可以(有点昂贵)从具有 USB 设备控制器和 UART 的微控制器构建自己的设备,但是桥接器是一个 USB 设备并且仍然必须连接到一个 USB 主机;这些通常用于将 PC 连接到缺少 USB 控制器或使用 USB 控制器的 software/CPU 开销太大的微控制器。
从理论上讲,您可以将具有 USB 主机控制器的微控制器连接到具有 USB 设备控制器的微控制器,但是您需要分别在每个主机和设备软件堆栈上,一旦建立了 USB 连接,实现 CDC/ACM 是对可用带宽的低效使用。 CDC/ACM class 的目的主要是让 "legacy" 软件可以在 PC 上运行。
如果您需要连接到 "real" 串行端口,您应该使用真正的 UART - 在任何情况下,它都比微控制器上的 USB 控制器更普遍。
您应该稍微了解一下 USB 设备 classes。 CDC 是 USB 设备 class,ACM 是我假设您正在使用的 subclass。您制作的设备可以称为 "CDC ACM device",因为它使用 CDC class 和 ACM subclass.
这些 classes 和 subclasses 由 USB Implementers Forum 在文档中定义,您可以在此处找到:
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 版本,您需要编写 Windows 10 "the driver has been rewritten by using the Kernel-Mode Driver Framework that improves the overall stability of the driver" 中的 INF file to associate your device to usbser.sys and sign it. For Windows 10 and later, there is a new INF file called usbser.inf already included with Windows which will automatically match any valid CDC ACM device. This means you don't have to write or distribute a driver for CDC ACM devices if you only intend to support using the device on Windows 10 or later. The partnership between Microsoft and Arduino which began in 2015 gives me hope that Microsoft will continue supporting and improving usbser.sys in the future. In fact, they claim,这是个好消息。
对于 Linux,有 cdc_acm 内核模块,它长期以来一直是内核的标准部分,应该可以自动与您插入的任何 CDC ACM 设备一起工作。
对于 Mac OS X,有 AppleUSBCDCACM 驱动程序,它应该可以自动与您插入的任何 CDC ACM 设备一起工作。
请注意,要使这些驱动程序中的任何一个能够识别您的设备并使用它,您的设备必须在其 USB 描述符中具有特定值,并且要求可能会有所不同,具体取决于您所谈论的确切驱动程序版本。
Will the USB port now simply look like a serial port?
不,这是错误的思考方式。 USB 端口仍然看起来像 USB 端口,但操作系统提供的各种 USB 驱动程序将识别 CDC ACM 设备插入该端口并在操作系统的串行端口列表中创建一个新条目。那么如果你运行一些只知道串行端口的软件,它可以连接到那个端口。
事实上,如果您制作一个复合设备,您可以将一个 USB 设备插入一个实际上有两个或更多虚拟串行端口的 USB 端口。