首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于STM32单片机的UART over USB

用于STM32单片机的UART over USB
EN

Stack Overflow用户
提问于 2015-06-03 01:14:50
回答 2查看 18.2K关注 0票数 4

我正在尝试在STM324x9I-EVAL开发板上通过USB接口实现UART。其目的是串行地向伺服控制器(或其他硬件)发送命令。我已经在开发板上成功地实现了USB_Device_CDC示例,但不确定在另一端没有安装驱动程序的PC的情况下它到底是如何工作的。就其他硬件而言,USB端口现在会看起来像串行端口吗?或者仍然需要驱动程序或另一端的某种接口?

我想指出的是,我知道下面这篇文章:

Emulating UART over USB

但我不相信我的问题在这个答案的背景下得到了完全的回答。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-03 04:45:40

USB连接不是像UART那样的点对点连接。它需要主机和设备处于主/从关系。设备无法启动数据传输;它必须由主机持续轮询。

CDC/ACM类设备在PC主机上提供了一个虚拟COM端口,但不允许该设备与UART接口通信。它看起来像软件级别的串行端口,但不实现UART物理层。为了让它看起来像一个PC串口,引擎盖下发生了很多可怕的事情,但在物理层面上,它没有一个像UART通信。

有些设备充当UART/USB桥接器(例如,来自FTDI和多产的),您可以(有点昂贵地)从具有USB设备控制器和UART的微控制器构建自己的设备,但是桥接器是USB设备,并且仍然必须连接到USB主机;这些设备通常用于将PC连接到缺少USB控制器的微控制器,或者使用USB控制器的软件/CPU开销太大。

从理论上讲,您可以将具有USB主机控制器的微控制器连接到具有USB设备控制器的微控制器,但是您需要分别在每个微控制器上安装主机和设备软件堆栈,并且一旦连接上USB,实现CDC/ACM就是对可用带宽的低效利用。CDC/ACM类的主要目的是允许“传统”软件在PC上运行。

如果你需要连接到一个“真正的”串行端口,你应该使用真正的UART --在任何情况下,它都比微控制器上的USB控制器普遍得多。

票数 6
EN

Stack Overflow用户

发布于 2015-06-03 11:15:54

您应该了解一些关于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驱动程序。对于早于Windows10的Windows10版本,您需要编写一个INF file来将您的设备与usbser.sys和sign it相关联。对于Windows10和更高版本,Windows中已经包含了一个名为usbser.inf的新INF文件,它将自动匹配任何有效的CDC ACM设备。这意味着,如果您只打算支持在Windows 10或更高版本上使用CDC ACM设备,则不必编写或分发该设备的驱动程序。partnership between Microsoft and Arduino which began in 2015给了我希望,微软将在未来继续支持和改进usbser.sys。事实上,他们claim说在Windows10中“驱动程序已经通过使用内核模式驱动程序框架进行了重写,从而提高了驱动程序的整体稳定性”,所以这是个好消息。

对于Linux,有一个内核模块,它长期以来一直是内核的标准部分,应该可以自动与您插入的任何CDC ACM设备一起工作。

对于Mac,有驱动程序,它应该自动与您插入的任何CDC ACM设备一起工作。

请注意,对于这些驱动程序中的任何一个,要识别您的设备并使用它,您的设备必须在其USB描述符中具有特定的值,并且要求可能会根据您谈论的确切驱动程序版本而有所不同。

现在的USB端口看起来会简单的像串行端口吗?

不,这是错误的思考方式。USB端口看起来仍然像USB端口,但操作系统提供的各种USB驱动程序将识别出CDC ACM设备已插入该端口,并在操作系统的串行端口列表中创建一个新条目。然后,如果您运行一些只知道串行端口的软件,它就可以连接到该端口。

实际上,如果您制作复合设备,您可以将单个USB设备插入单个USB端口,该端口实际上具有两个或更多个虚拟串行端口。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30602485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档