打印
[USB接口]

CDC串口-从认识到认知

[复制链接]
13796|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chayesss|  楼主 | 2021-11-21 13:39 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 chayesss 于 2021-11-21 13:39 编辑

                                                                 CDC串口之从认识到认知
      玩转嵌入式多年,很多应用场合需要使用USB转串口,根据设备类型主要分为USB VCP串口、USB转CDC串口、HID转串口。USB HID从Win2000版本起内置驱动,是真正意义上的免驱,CDC串口驱动从Win10系统版本才开始内置,因CDC协议的用途定位,串口功能较其他方式并不完整。VCP串口驱动只需安装一次也可以联网自动安装,且有部分操作系统会内置厂商VCP驱动。根据实际使用情况,做了下对比汇总:
  
对比项
  
对比功能
对比驱动类
CDC-ACM
HID
VCP
串口功能
串口收发功能
DTR/DSR/DCD/RI
RTS/CTS
X
硬件流控功能
X
软件流控功能
X
USB PnP和电源管理
串口未关闭时插拔USB可正常工作
X[1]
系统睡眠唤醒后正常工作
X[1]
系统休眠唤醒后正常工作
X[1]
驱动扩展功能
支持串口功能以外的功能扩展
X
驱动安装方式
Windows
Win10及以上内置
内置
首次需安装/联网自动安装
Linux
部分系统内置
内置
部分系统内置
macOS
内置
内置
部分系统内置
Android
部分系统内置
内置
部分系统内置
串口应用软件
串口软件兼容程度
有部分功能不兼容
不兼容
兼容
协议规范
公开或私有协议
CDC-ACM规范
私有
私有
[1]微软官方称:在win10中,重写了CDC驱动,应该会有所改善。
从实测情况来看,不难看出为何主流USB转串口厂商提供的均是VCP串口应用方式。
这里提到的VCP串口主要是指使用厂商专用USB转串口驱动和通信协议实现的串口,该方式也最接近16C450/16C550等原生串口。HID转串口USB传输速度没有CDC和VCP快,不适合较高波特率通讯,且不兼容串口应用软件。CDC转串口因协议限制和不同系统驱动的差异(且无法立刻更新),使用时相比原生串口会存在一些区别。
一、CDC串口介绍
记得之前看到有些手机连接电脑时,电脑安装驱动后设备管理器里会多出来一个串口,出于好奇,使用usbview工具看了下,原来是手机USB模拟的CDC-ACM串口设备,主要用于设备调试和共享上网,不少GPS、4G通讯模块预留的USB接口实际上也是CDC串口。
CDC-ACM,是USB ORG组织在1999年基于通信类设备推出的一个USB通用设备类别,事实上,绝大多数使用CDC串口的USB应用,并不处理串口操作,仅借助于CDC串口驱动实现USB设备和USB主机之间的数据透传。
CDC串口的主要特点:
(1)无需为产品开发专用的USB驱动程序,但无法达到HID类设备的在所有系统上面的免驱效果。目前已有不少系统已集成CDC-ACM驱动,且驱动也在不断完善,如在WIN8.1前需要驱动安装包还需要做驱动包的数字签名,因为系统只集成了SYS;如WIN10系统集成了微软重新编写的CDC-ACM驱动。
(2)固件开发容易,CDC-ACM类规范内容简单,数据上下传内容为透传方式。
(3)可以实现部分串口功能。CDC-ACM类规范为兼容早期的Modem外设,还增加了部分原生串口(16C450/550)的类请求,如串口参数设置和DTR/DSR的控制,但串口软件中较常用的CTS/RTS不支持,且不同操作系统下实现的CDC类驱动,还存在CTS状态不变且不可更改的差异。如需实现完整的串口功能,还是需要使用专用的串口驱动。

因各操作系统内置的CDC驱动也在不断更新维护,在产品应用中,也难免遇到各种影响串口正常使用的情况。
CDC类分为以下模型:USB电话业务(PSTN、POTS)模型,USBISDN模型和USB网络模型。PSTN协议规范涉及3种控制模型:
  ①  Direct Line ControlModel
  ②  Abstract ControlModel(ACM)
  ③  Telephone ControlModel
通常提到的CDC串口属于PSTN(Public Switched Telephone Network)下的AbstractControl Model,简称CDC ACM。
基于CDC ACM协议实现的USB转硬件串口,数据接口使用CDC DATA完成串口数据的收发,控制接口用于完成串口的参数配置等操作。规范支持的命令请求如下:
   和串口操作相关的命令如上所示。通过其协议可看出协议不包含串口硬件流控命令和CTS状态上报等功能。

二、CDC串口应用总结
基于CDC-ACM协议开发纯USB传输应用还是十分方便的,工程师只需要关注USB设备本身的开发工作,驱动软件甚至是应用软件均不用开发。
基于其实现硬件串口功能时,会受限于协议规范和系统驱动。结合之前的项目应用经验以及实际测试情况总结了以下几点注意事项:

Windows系统
   串口未关闭时,插拔一次USB,后续串口应用软件无法再打开串口。使用时建议先关闭串口再进行插拔
   串口RTS(RequestTo Send)信号不能单独控制
   串口CTS(Clear To Send)信号不支持
   串口不支持软件和硬件流控
   系统睡眠休眠行为有概率导致串口接收停止
Linux系统
   串口Modem输入信号CTS/DSR/RI/DCD均不支持
   串口帧错误/校验错误/溢出错误等无法上报
   串口不支持软件和硬件流控
mac OS系统
   串口Modem输入信号CTS/DSR/RI/DCD均不支持
   串口帧错误/校验错误/溢出错误等无法上报
   串口不支持软件和硬件流控

工程师在实际应用时可以结合如上注意事项,针对不同的应用场景有所筛选。此外,因为使用的驱动为操作系统自带,由操作系统厂商维护,如Windows系统和驱动由微软维护,macOS系统和驱动由Apple维护,此驱动只会随系统更新,很慢。如下一些应用,只能使用VCP串口。
   需要使用RTS输出功能进行IO控制,如MCU下载电路
   需要使用CTS输入功能用作IO输入检测,如串口读卡器使用该信号进行设备在线检测
   需要使用RTS/CTS硬件流控,如串口通讯双方收发速度不匹配时
   需要进行大数据量连续通讯,如高波特率串口下载,Linux控制台文件或日志传输







979336194788492ca4.png (35.07 KB )

979336194788492ca4.png

93546194788a4e512.png (35.07 KB )

93546194788a4e512.png

使用特权

评论回复

相关帖子

沙发
小小攻城狮| | 2021-12-23 18:20 | 只看该作者
拿到USB转串口芯片后,如何确定使用的是不是CDC串口协议?

使用特权

评论回复
板凳
OIDCAT| | 2021-12-28 18:51 | 只看该作者
小小攻城狮 发表于 2021-12-23 18:20
拿到USB转串口芯片后,如何确定使用的是不是CDC串口协议?

其实很好确认的,比如插在Windows系统上,则”设备管理器"中出现USB串行设备,则表示该芯片支持CDC协议。Linux底下则出现的ttyACM设备,不过一般建议使用厂商驱动,毕竟因为CDC协议的固化,在一些应用方面得不到满足,或者收发的处理等都有一些差异

使用特权

评论回复
地板
林实海| | 2022-1-14 19:02 | 只看该作者
感谢分享

使用特权

评论回复
5
musich| | 2022-7-13 23:26 | 只看该作者
不错.

使用特权

评论回复
6
li880wert| | 2022-8-3 18:21 | 只看该作者
USB  CDC 一受干扰就死机,完全没法用 ,除非WINDOWS 重写底层驱动 ,

使用特权

评论回复
7
mxkw0514| | 2024-7-8 00:02 | 只看该作者
USB CDC可以理解为虚拟串口,请问如何理解USB HID呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝