CDC串口之從認(rèn)識到認(rèn)知
玩轉(zhuǎn)嵌入式多年,很多應(yīng)用場合需要使用USB轉(zhuǎn)串口,根據(jù)設(shè)備類型主要分為USB VCP串口、USB轉(zhuǎn)CDC串口、HID轉(zhuǎn)串口。USB HID從Win2000版本起內(nèi)置驅(qū)動,是真正意義上的免驅(qū),CDC串口驅(qū)動從Win10系統(tǒng)版本才開始內(nèi)置,因CDC協(xié)議的用途定位,串口功能較其他方式并不完整。VCP串口驅(qū)動只需安裝一次也可以聯(lián)網(wǎng)自動安裝,且有部分操作系統(tǒng)會內(nèi)置廠商VCP驅(qū)動。
根據(jù)實(shí)際使用情況,做了下對比匯總:
對比項(xiàng)
對比功能
對比驅(qū)動類
CDC-ACM
HID
VCP
串口功能
串口收發(fā)功能
√
√
√
DTR/DSR/DCD/RI
√
√
√
RTS/CTS
X
√
√
硬件流控功能
X
√
√
軟件流控功能
X
√
√
USB PnP和電源管理
串口未關(guān)閉時插拔USB可正常工作
X[1]
√
√
系統(tǒng)睡眠喚醒后正常工作
X[1]
√
√
系統(tǒng)休眠喚醒后正常工作
X[1]
√
√
驅(qū)動擴(kuò)展功能
支持串口功能以外的功能擴(kuò)展
X
√
√
驅(qū)動安裝方式
Windows
Win10及以上內(nèi)置
內(nèi)置
首次需安裝/聯(lián)網(wǎng)自動安裝
Linux
部分系統(tǒng)內(nèi)置
內(nèi)置
部分系統(tǒng)內(nèi)置
macOS
內(nèi)置
內(nèi)置
部分系統(tǒng)內(nèi)置
Android
部分系統(tǒng)內(nèi)置
內(nèi)置
部分系統(tǒng)內(nèi)置
串口應(yīng)用軟件
串口軟件兼容程度
有部分功能不兼容
不兼容
兼容
協(xié)議規(guī)范
公開或私有協(xié)議
CDC-ACM規(guī)范
私有
私有
[1] 微軟官方稱:在win10中,重寫了CDC驅(qū)動,應(yīng)該會有所改善。
從實(shí)測情況來看,不難看出為何主流USB轉(zhuǎn)串口廠商提供的均是VCP串口應(yīng)用方式。
這里提到的VCP串口主要是指使用廠商專用USB轉(zhuǎn)串口驅(qū)動和通信協(xié)議實(shí)現(xiàn)的串口,該方式也最接近16C450/16C550等原生串口。HID轉(zhuǎn)串口USB傳輸速度沒有CDC和VCP快,不適合較高波特率通訊,且不兼容串口應(yīng)用軟件。CDC轉(zhuǎn)串口因協(xié)議限制和不同系統(tǒng)驅(qū)動的差異(且無法立刻更新),使用時相比原生串口會存在一些區(qū)別。
一、CDC串口介紹
記得之前看到有些手機(jī)連接電腦時,電腦安裝驅(qū)動后設(shè)備管理器里會多出來一個串口,出于好奇,使用usbview工具看了下,原來是手機(jī)USB模擬的CDC-ACM串口設(shè)備,主要用于設(shè)備調(diào)試和共享上網(wǎng),不少GPS、4G通訊模塊預(yù)留的USB接口實(shí)際上也是CDC串口。
CDC-ACM,是USB?ORG組織在1999年基于通信類設(shè)備推出的一個USB通用設(shè)備類別,事實(shí)上,絕大多數(shù)使用CDC串口的USB應(yīng)用,并不處理串口操作,僅借助于CDC串口驅(qū)動實(shí)現(xiàn)USB設(shè)備和USB主機(jī)之間的數(shù)據(jù)透傳。
CDC串口的主要特點(diǎn):
(1)無需為產(chǎn)品開發(fā)專用的USB驅(qū)動程序,但無法達(dá)到HID類設(shè)備的在所有系統(tǒng)上面的免驅(qū)效果。目前已有不少系統(tǒng)已集成CDC-ACM驅(qū)動,且驅(qū)動也在不斷完善,如在WIN8.1前需要驅(qū)動安裝包還需要做驅(qū)動包的數(shù)字簽名,因?yàn)橄到y(tǒng)只集成了SYS;如WIN10系統(tǒng)集成了微軟重新編寫的CDC-ACM驅(qū)動。
(2)固件開發(fā)容易,CDC-ACM類規(guī)范內(nèi)容簡單,數(shù)據(jù)上下傳內(nèi)容為透傳方式。
(3)可以實(shí)現(xiàn)部分串口功能。CDC-ACM類規(guī)范為兼容早期的Modem外設(shè),還增加了部分原生串口(16C450/550)的類請求,如串口參數(shù)設(shè)置和DTR/DSR的控制,但串口軟件中較常用的CTS/RTS不支持,且不同操作系統(tǒng)下實(shí)現(xiàn)的CDC類驅(qū)動,還存在CTS狀態(tài)不變且不可更改的差異。如需實(shí)現(xiàn)完整的串口功能,還是需要使用專用的串口驅(qū)動。
?
因各操作系統(tǒng)內(nèi)置的CDC驅(qū)動也在不斷更新維護(hù),在產(chǎn)品應(yīng)用中,也難免遇到各種影響串口正常使用的情況。
CDC類分為以下模型:USB電話業(yè)務(wù)(PSTN、POTS)模型,USB ISDN模型和USB網(wǎng)絡(luò)模型。PSTN協(xié)議規(guī)范涉及3種控制模型:
l? Direct Line Control Model
l? Abstract Control Model(ACM)
l? Telephone Control Model
通常提到的CDC串口屬于PSTN(Public Switched Telephone Network)下的Abstract Control Model,簡稱CDC ACM。
基于CDC ACM協(xié)議實(shí)現(xiàn)的USB轉(zhuǎn)硬件串口,數(shù)據(jù)接口使用CDC DATA完成串口數(shù)據(jù)的收發(fā),控制接口用于完成串口的參數(shù)配置等操作。規(guī)范支持的命令請求如下:
和串口操作相關(guān)的命令如上所示。通過其協(xié)議可看出協(xié)議不包含串口硬件流控命令和CTS狀態(tài)上報等功能。
?
二、CDC串口應(yīng)用總結(jié)
基于CDC-ACM協(xié)議開發(fā)純USB傳輸應(yīng)用還是十分方便的,工程師只需要關(guān)注USB設(shè)備本身的開發(fā)工作,驅(qū)動軟件甚至是應(yīng)用軟件均不用開發(fā)。
基于其實(shí)現(xiàn)硬件串口功能時,會受限于協(xié)議規(guī)范和系統(tǒng)驅(qū)動。結(jié)合之前的項(xiàng)目應(yīng)用經(jīng)驗(yàn)以及實(shí)際測試情況總結(jié)了以下幾點(diǎn)注意事項(xiàng):
?
Windows系統(tǒng)
l? 串口未關(guān)閉時,插拔一次USB,后續(xù)串口應(yīng)用軟件無法再打開串口。使用時建議先關(guān)閉串口再進(jìn)行插拔。
l? 串口RTS(Request To Send)信號不能單獨(dú)控制
l? 串口CTS(Clear To Send)信號不支持
l? 串口不支持軟件和硬件流控
l? 系統(tǒng)睡眠休眠行為有概率導(dǎo)致串口接收停止
Linux系統(tǒng)
l? 串口Modem輸入信號CTS/DSR/RI/DCD均不支持
l? 串口幀錯誤/校驗(yàn)錯誤/溢出錯誤等無法上報
l? 串口不支持軟件和硬件流控
mac OS系統(tǒng)
l? 串口Modem輸入信號CTS/DSR/RI/DCD均不支持
l? 串口幀錯誤/校驗(yàn)錯誤/溢出錯誤等無法上報
l? 串口不支持軟件和硬件流控
?
工程師在實(shí)際應(yīng)用時可以結(jié)合如上注意事項(xiàng),針對不同的應(yīng)用場景有所篩選。此外,因?yàn)槭褂玫尿?qū)動為操作系統(tǒng)自帶,由操作系統(tǒng)廠商維護(hù),如Windows系統(tǒng)和驅(qū)動由微軟維護(hù),macOS系統(tǒng)和驅(qū)動由Apple維護(hù),此驅(qū)動只會隨系統(tǒng)更新,很慢。如下一些應(yīng)用,只能使用VCP串口。
l? 需要使用RTS輸出功能進(jìn)行IO控制,如MCU下載電路
l? 需要使用CTS輸入功能用作IO輸入檢測,如串口讀卡器使用該信號進(jìn)行設(shè)備在線檢測
l? 需要使用RTS/CTS硬件流控,如串口通訊雙方收發(fā)速度不匹配時
l? 需要進(jìn)行大數(shù)據(jù)量連續(xù)通訊,如高波特率串口下載,Linux控制臺文件或日志傳輸
?
?
?