一、问题描述
使用GD32单片机串口进行通信测试,单片机的串口配置的是偶校验(Even)、数据位为8、停止位为1、波特率为9600。串口测试软件用的格西烽火,软件的配置如下:
单片机通过串口和串口测试软件进行通信交互,软件收到的数据和单片机发送的数据不一致。
二、解决办法
UART 串口的特点是将数据一位一位地顺序传送,只要 2 根传输线就可以实现双向通信,一根线发送 数据的同时用另一根线接收数据。UART 串口通信有几个重要的参数,分别是波特率、起始位、数据位、停止位和奇偶检验位,对于两个使用 UART 串口通信的端口,这些参数必须匹配,否则通信将无法正常完成。 UART 串口传输的数据格式如下图所示:
- 空闲位:数据线在空闲状态的时候为逻辑“1”状态,也就是高电平,表示没有数据线空闲, 没有数据传输。
- 起始位:当要传输数据的时候先传输一个逻辑“0”,也就是将数据线拉低,表示开始数据 传输。
- 数据位:数据位就是实际要传输的数据,数据位数可选择 5~8 位,我们一般都是按照字节传输数据的,一个字节 8 位,因此数据位通常是 8 位的。低位在前,先传输,高位最后传输。
- 奇偶校验位:这是对数据中“1”的位数进行奇偶校验用的,可以不使用奇偶校验功能。
- 停止位:数据传输完成标志位,停止位的位数可以选择 1 位、1.5 位或 2 位高电平,一般都 选择 1 位停止位。
- 波特率:波特率就是 UART 数据传输的速率,也就是每秒传输的数据位数,一般选择 9600、 19200、115200 等。
GD32官方用户手册关于串口的介绍:
单片机的串口配置中数据位的最后一位可以用作校验位。所以如果数据有8位,又有奇校验或者偶校验(需要占1位数据)的时候,则GD32单片机配置的数据长度应为9。
三、验证
代码修改如下:
//修改前
usart_parity_config(USART2, USART_PM_EVEN);
usart_word_length_set(USART2, USART_WL_8BIT);
//修改后
usart_parity_config(USART2, USART_PM_EVEN);
usart_word_length_set(USART2, USART_WL_9BIT);
重新编译,测试可以看到串口测试软件和单片机之间的数据交互是正常的。
stm32参考资料
链接1
链接2