本文主要是介绍【嵌入式学习笔记】---- 串口通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1 串口
1.1 什么是串口
即串行通信接口,如:RS-232和RS-485
1.2 物理层
1.2.1 RS-232信号线
在旧式计算机中一般会有RS-232标准的COM口(也被称为DB9接口),如图:
信号线功能说明见下表:
引脚号 | 名称 | 符号 | 功能说明 |
---|---|---|---|
1 | 载波检测 | DCD | 检测是否收到载波信号 |
2 | 接收数据 | RXD | 接受数据信号,即输入 |
3 | 发送数据 | TXD | 发送数据信号,即输出 |
4 | 数据终端就绪 | DTR | 向对方告知本机是否准备好 |
5 | 信号地 | GND | 共地 |
6 | 数据设备就绪 | DSR | 向对方告知本机是否处于待命状态 |
7 | 请求发送 | RTS | 请求发送 |
8 | 允许发送 | CTS | 回应RTS请求 |
9 | 响铃指示 | RI | 表示线路已接通 |
实际使用过程中,一般只使用RXD,TXD,GND三条信号线,就可实现数据传输
1.2.2 电平标准
通信标准 | 电平标准 |
---|---|
CMOS电平(3.3V) | 逻辑0:0V;逻辑1:3.3V |
TTL电平(5.0V) | 逻辑0:0-0.5V;逻辑1:2.4-5.0V |
RS-232电平 | 逻辑0:+3至+15V;逻辑1:-15至-3V |
CMOS/TTL电平不能直接与RS-232电平直接交换信息
1.2.3 通信结构图
RS-232通信:
STM32串口与电脑USB口通信:
1.3 协议层
串口数据包的组成:
1.3.1 起始位
必须占一个位长,且为逻辑0电平
1.3.2 有效数据位
起始位之后,可选5、6、7、8、9个位长,最低有效位在前,最高有效位在后
1.3.3 校验位
可选占一个位长,也可以没有该位
①奇偶校验:
奇校验:数据位中“1”的个数与校验位中“1”的个数之和应该为奇数
偶校验:数据位中“1”的个数与校验位中“1”的个数之和应该为偶数
②代码和校验:
发送方将所有要发送的数据块求和(或各字节异或),产生一个字节的校验字符(校验和)附加到数据块末尾。接收方接收数据的同时,对数据块求和(或各字节异或),将结果与发送方的校验和进行比较,相符表示传输正常
③0、1校验:
0校验是不管有效数据中的内容是什么,校验位总为“0”,1校验是校验位总为“1”
④无校验:数据包中没有校验位
1.3.4 停止位
可有0.5、1、1.5、2个位长。保持逻辑1电平
2 STM32的USART介绍
2.1 USART简介
Universal synchronous asynchronous receiver transmitter:通用同步异步收发器
Universal asynchronous receiver transmitter:通用异步收发器
2.2 通信流程图
2.3 波特率计算
波特率是指数据信号对载波的调制速率
波特率 = f P L C K 16 ∗ U S A R T D I V 波特率=\frac{f_{PLCK}}{16*USARTDIV} 波特率=16∗USARTDIVfPLCK
- 其中 f P L C K f_{PLCK} fPLCK是USART的时钟
- USARTDIV是存放在波特率寄存器(USART_BRR)的一个无符号定点数;DIV_Mantissa[11:0] 位定义 USARTDIV 的整数部分,DIV_Fraction[3:0] 位定义USARTDIV 的小数部分
使用寄存器操作设置波特率
波特率为115200;时钟为72MHz,得USARTDIV=39.0625
点击查看代码uint16_t mantissa;
uint16_t fraction;
mantissa=39;
fraction=0.0625*16+0.5=0x01; /*根据波特率公式计算,加0.5是进行四舍五入,减小误差*/
USART->BRR=(mantissa << 4)+fraction;
由于左移4位和乘以16倍是等价的,故可直接对USARTDIV进行操作即可,无需分整数小数,即
USART->BRR=USARTDIV * 16 + 0.5
这篇关于【嵌入式学习笔记】---- 串口通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!