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)模型,USB ISDN模型和USB网络模型。PSTN协议规范涉及3种控制模型:

l  Direct Line Control Model

l  Abstract Control Model(ACM)

l  Telephone Control Model

1.png

通常提到的CDC串口属于PSTN(Public Switched Telephone Network)下的Abstract Control Model,简称CDC ACM。

基于CDC ACM协议实现的USB转硬件串口,数据接口使用CDC DATA完成串口数据的收发,控制接口用于完成串口的参数配置等操作。规范支持的命令请求如下:

2.png

和串口操作相关的命令如上所示。通过其协议可看出协议不包含串口硬件流控命令和CTS状态上报等功能。

 

二、CDC串口应用总结

基于CDC-ACM协议开发纯USB传输应用还是十分方便的,工程师只需要关注USB设备本身的开发工作,驱动软件甚至是应用软件均不用开发。

基于其实现硬件串口功能时,会受限于协议规范和系统驱动。结合之前的项目应用经验以及实际测试情况总结了以下几点注意事项:

 

Windows系统

l  串口未关闭时,插拔一次USB,后续串口应用软件无法再打开串口。使用时建议先关闭串口再进行插拔。

l  串口RTS(Request To Send)信号不能单独控制

l  串口CTS(Clear To Send)信号不支持

l  串口不支持软件和硬件流控

l  系统睡眠休眠行为有概率导致串口接收停止

Linux系统

l  串口Modem输入信号CTS/DSR/RI/DCD均不支持

l  串口帧错误/校验错误/溢出错误等无法上报

l  串口不支持软件和硬件流控

mac OS系统

l  串口Modem输入信号CTS/DSR/RI/DCD均不支持

l  串口帧错误/校验错误/溢出错误等无法上报

l  串口不支持软件和硬件流控

 

工程师在实际应用时可以结合如上注意事项,针对不同的应用场景有所筛选。此外,因为使用的驱动为操作系统自带,由操作系统厂商维护,如Windows系统和驱动由微软维护,macOS系统和驱动由Apple维护,此驱动只会随系统更新,很慢。如下一些应用,只能使用VCP串口。

l  需要使用RTS输出功能进行IO控制,如MCU下载电路

l  需要使用CTS输入功能用作IO输入检测,如串口读卡器使用该信号进行设备在线检测

l  需要使用RTS/CTS硬件流控,如串口通讯双方收发速度不匹配时

l  需要进行大数据量连续通讯,如高波特率串口下载,Linux控制台文件或日志传输