一、简介

USB转串口即实现计算机USB接口到物理串口之间的转换。可以为没有串口的计算机或其他USB主机增加串口,使用USB转串口设备等于将传统的串口设备变成了即插即用的USB设备。

USB虚拟串口应用特点:

USB应用广泛,支持热插拔,传输速度快。

仿真标准串口,用于升级原串口设备,或通过USB增加额外串口。

串口应用程序完全兼容,无需修改。

支持各类操作系统,如:Windows/Linux/Android/macOS。

二、工作原理

USB主机检测到USB转串口设备插入后,首先会对设备复位,然后开始USB枚举过程。USB枚举时过程会获取设备描述符、配置描述符、接口描述符等。描述符中会包含USB设备的厂商ID,设备ID和Class类别等信息。操作系统会根据该信息为设备匹配相应的USB设备驱动。

USB虚拟串口的实现在系统上依赖于USB转串口驱动,一般由厂家直接提供,也可以使用操作系统自带的CDC类串口驱动等。驱动主要分为2个功能,其一注册USB设备驱动,完成对USB设备的控制与数据通讯,其二注册串口驱动,为串口应用层提供相应的实现方法。

串口收发对应的驱动数据流向:

串口发送

串口应用发送数据->USB串口驱动获取数据->驱动将数据经过USB通道发送给USB串口设备->USB串口设备接收到数据通过串口发送

串口接收

USB串口设备接收串口数据->将串口数据经过USB打包后上传给USB主机->USB串口驱动获取到通过USB上传的串口数据->驱动将数据保存在串口缓冲区提供给串口应用读取

三、应用场景

MCU下载

串口调试

嵌入式串口控制台

智能家居

打印办公

工业控制

门禁考勤

串口线缆

四、串口通信基础

当两个设备使用UART进行通信时,它们至少通过三根导线连接:TXD串口发送、RXD串口接收、GND。串口设备通过改变TXD信号线上的电压来发送数据,接收端通过检测RXD线上的电压来读取数据。

什么是串口通信

计算机一次传输信息(数据)一位或多个比特位。串行是指传输数据一次只传输一位。当进行串口通信时发送或者接收的每个字(即字节或字符)一次发送一位。每一位都是逻辑‘1’或者‘0’。也用Mark表示逻辑1,Space表示逻辑0。

串口数据速率使用 bits-per-second ("bps") 或者 baud rate ("baud")。这表示一秒内可以传输多少逻辑1和0。当波特率超过 1000,你会经常看到用Kbps表示的速率。对于超过 1000000 的速率一般用Mbps 来表示。

TTL串口

实际应用中,使用TTL电平逐渐成为趋势,在MCU与串口转接芯片提供的串口中比较常见,此时逻辑1电压值:+5V或+3.3V等,逻辑0电压值:0V(逻辑地)。

RS-232串口

RS-232 是由 EIA 定义的用于串口通信的标准电气接口。RS-232 实际上有三种不同的类型(A,B和C),每一种对于逻辑1和逻辑0,电平定义了不同的电压范围。最常用的种类是 RS-232C,它定义逻辑1电压范围:-3V~-12V 和逻辑0电压范围:+3V~+12V。

下面列举最为常见的 DB-9 接口分布图,引脚和功能描述如下所示:

android otg 接串口 安卓usb转串口_USB转串口

其他还有RS-422以及 RS-485 串口标准。RS-422 使用更低电压与差分信号允许线缆长达 1000英尺(300m)。

常用串口信号定义

GND - 逻辑地

从技术上讲,逻辑接地不是信号,但没有它,其他信号就不能工作。从根本上说,逻辑地充当一个参考电压,从而知道哪些电压为正或负。

TXD - 发送数据
RXD - 接收数据
RTS - 请求发送

RTS设置为逻辑0电平表示己方准备好接收数据。一般与CTS一起用于串口流控,通常被设置为默认有效状态。

除流控功能外,RTS也可用作通用输出信号,输出高低电平。常用于单片机复位或串口下载电路。

CTS - 清除发送

CTS信号接收自串口线缆的另一端。信号线逻辑0电平表示己方可以发送数据。一般与RTS一起用于串口数据流控。

DTR - 数据终端就绪

DTR 信号用于通知对端计算机或设备己方已就绪(逻辑0电平)或未就绪(逻辑1电平)。DTR也可用作通用输出信号,输出高低电平。常用于单片机复位或串口下载电路。

串口波特率

波特率是指串口每秒钟传输的bit总数,如:9600波特率。表示1s传输9600个比特。1个比特所需时间为:1/9600 ≈ 0.104ms

android otg 接串口 安卓usb转串口_串口_02

串口异步通信

解析串口数据需要确定一个字符的结束与下一个字符的开始。

串口数据线空闲时保持在逻辑1状态直到有字符发送。每个字节起始位在前,字节的每一位紧随其后,一位可选校验位以及一位或者两位停止位。起始位始终是逻辑0,通知对方有新串口数据可用。数据可以同时发送和接收,因此称为“异步”。

android otg 接串口 安卓usb转串口_串口_03

偶校验:数据位加上校验位中的“1”的个数保持为偶数。

奇校验:数据位加上校验位中的“1”的个数保持为奇数。

空白校验:也称Space校验,校验位永远是0。

标志校验:也称Mark校验,校验位永远是1。

无校验:没有校验位存在或被传输。

剩下的位称作停止位。在字符之间可能会有 1,1.5 或者 2 位停止位并且这些位总为 1。异步数据格式通常表达成“8N1”,“7E1”等。

什么是全双工和半双工

全双工是指设备可以同时发送和接收数据,有两个独立数据通道(一路输入,一路输出)。

半双工是指设备不能同时发送和接收数据,这通常意味着只有一路可以通讯,如RS485串口。

串口流控

在两个串口设备间传输数据时经常有必要进行数据流控。这可能是受到中间串口通信线路、其中一个设备或者其他存储介质的限制。异步数据流控通常使用的有两种方法。

第一种方法通常称为“软件”流控,使用特殊字符开始(XON or DC1)或者停止(XOFF or DC3)数据流。这些字符定义参见 ASCII 码表。这些码值在传输文本信息时很有用,但不能在未经特殊编程时用于传输其他类型的信息。

第二种方法称作“硬件”流控,使用RTS和CTS信号线取代特殊字符。当接收方准备好接收数据时会将RTS置为逻辑0以请求对方发送数据,当未准备好时置为逻辑1,因此发送方会通过检测 CTS 电平状态判断是否可以发送数据。

使用硬件流控至少需要连接的信号线有GND、RXD、TXD、RTS、CTS。

使用软件流控只需要GND、RXD、TXD。

Break信号

通常情况下收发数据信号线保持在逻辑1状态直到传输一个新字节。如果信号拉低至逻辑0一段时间(各平台定义不同,通常是 1/4 到 1/2 秒)那么就说一个 break 条件满足。一个break信号有时用于复位通讯或者改变通讯硬件的操作模式,如MODEM。

五、各操作系统下串口使用

以USB转串口设备CH343为例(CDC类,可使用操作系统内置CDC驱动,也可以使用厂商提供的多功能VCP驱动),介绍USB虚拟串口在各平台下使用过程。

Windows系统

将USB设备接入电脑后,查看设备管理器,硬件驱动成功后显示如下(使用CDC串口驱动):

android otg 接串口 安卓usb转串口_android otg 接串口_04

使用厂商VCP串口驱动时:

android otg 接串口 安卓usb转串口_串口通信_05

Linux系统

通过shell命令“lsusb”确认usb串口设备是否被正常识别:

android otg 接串口 安卓usb转串口_串口_06

通过“ls /dev”确认插入前后串口设备节点ttyACM(CDC驱动模式下)或ttyUSB(VCP驱动模式下)是否生成;

也可通过“dmesg”查看内核消息日志,查看USB串口设备枚举过程及驱动加载过程:

android otg 接串口 安卓usb转串口_USB_07