UART协议介绍
日期 | 版本 | 内容修改 |
---|---|---|
2024/04/03 | V0 | 初版 |
UART协议即Universal Asynchronous Receiver/Transmitter,是一种串行、异步、全双工通信协议。
UART也常常被称作串口。
1. 信号名称
- txd:UART发送数据线
- rxd:UART接收数据线
1.1. 传输格式
UART的传输格式如下图所示(图源[1],有修改)。
1.1.1. 字符帧每个部分各自的含义
- 空闲:空闲状态下,信号是高电平。
- 起始位:1 bit高电平,表征字符帧的开始。
- 数据位:若干bit的有效数据。
- 校验位:用于简单校验传输是否正确的1 bit特殊位。
- 停止位:若干bit(甚至不一定是整数)的高电平,表征字符帧的结束。
2. UART的异步参数
UART最大的特点就是异步收发,不需要传递时钟信号。为了做到这一点,收发双方必须提前约定一些参数,否则不能正确地传输数据。
一般需要约定以下参数:
-
传输字长:一个字符帧中有效的数据位数。
- 可能的值:5, 6, 7, 8, 9 bit等
-
大小端:指先传输LSB或MSB。
- 可能的值:小端(little endian)即先传LSB,大端(big endian)即先传MSB
-
奇偶校验位[1:1]:即多加一位数据,与有效数据一起传输,接收方收到后将有效数据和校验位一起做某些运算来检验传输是否出错。
奇偶校验只能检验最基本的错误(比如只有1 bit传输错误),而且不能纠正。设定了校验格式后,发送端就会按照既定格式给校验位赋值。- none:不做校验
- even:偶校验,有效数据和校验位中总计有偶数个“1”
- odd:奇校验,有效数据和校验位中总计有奇数个“1”
- mark:1校验,固定校验位为“1”
- space:0校验,固定校验位为“1”
-
波特率(baud rate):传输码元的速率。
码元(symbol)[2]:从英文角度symbol来理解比较简单。比如同样的数据1100_0101:假如定义符号的码值为
char 'a'=1'b0; char 'b'=1'b1;
,这样数据就翻译为'bbaa_abab',此时码元长度是1 bit;如果定义符号的码值为char 'a'=2'b00; char 'b'=2'b01; char 'c'=2'b10; char 'd'=2'b11;
,这样数据就翻译为'da_bb',此时码元长度是2 bit。因此码元其实是人为定义的一种符号(数据包),它的长度至少为1 bit。
波特率一定指的是码元的传输速率,位的传输速率是“比特率”。只不过如果不定义码元,那一般码元就是1 bit,所以此时波特率等于比特率。
- 常见的标准值有9600, 19200, 38400 symbol/s等,此时需求的时钟频率一般为48 MHz
-
停止位长度:一个字符帧传输结束后会额外发送若干bit的高电平,代表此字符帧已经停止,称为停止位。
\(停止位的高电平时间/一比特对应时间\) 就是停止位长度,一般用bit作单位。- 可能的值:1, 1.5, 2等
注意:UART参数未必仅限于以上提到的,取值也未必仅限于以上提到的。前面说过UART是收发双方约定格式的,理论上只要你能约定,想怎么约定都可以。但是如果收发其中某一方不支持你修改为任意值,就无法正常通信。
比如以下是matlab中对串口参数的约束。使用 doc serial
可以查看串口定义属性。