串口&RS232&RS485通讯协议
注意:本文章需要配合无际单片机编程-硬件基础2.0教程视频学习。
注意:本文章需要配合无际单片机编程-硬件基础2.0教程视频学习。
一、 串口的硬件连接:
串口通讯是单片机通讯最常用的接口之一,一般用于不同单片机之间,或单片机和WIFI模块、4G模块、蓝牙模块、电脑之间的通讯。
串口通讯的硬件接口一般由三根线组成,GND,TXD, RXD组成;
TXD:负责数据发送
RXD:负责数据接收
GND: 地线,两个设备串口需要共地才可以正常通讯;
两个设备通过串口通讯的硬件连接如上图所示;
二、 串口的通讯协议:(了解)
串口是一种通用的串行数据总线,该总线双向通信,可实现全双工数据传输;
1、 串口通讯的数据格式:
(上图截自STM32中文数据手册519页)
2、 串口通讯数据说明:
串口通讯由 起始位+有效数据+奇偶校验+停止位组成;
串口一般都是由单片机内部集成的,不同单片机的参数有区别,具体以单片机的规格书为准;
①起始位: 低电平
②有效数据: 需要传输的数据,有8bit 或者9bit; 比较常用的是8bit
③奇偶校验: 奇校验 偶校验 无校验 0x32 0011 0010 1
- 奇校验定义:保证通讯有效数据+奇偶检验 数据中,所有的1的个数是单数,有效数据中1(二进制)的个数是双数,校验位是1,否则为0,
- 偶校验定义:保证通讯有效数据+奇偶检验 数据中,所有的1的个数是双数,有效数据中1 (二进制)的个数是单数,校验位是1,否则为0。
④停止位:
- 1个停止位:停止位位数的默认值。
- 2个停止位:停止位是2bit
- 5个停止位:停止位是0.5bit
- 5个停止位:停止位是1.5bit
⑤波特率:
波特率用来决定串口通讯1bit 高低电平持续的时间长短的,我们比较常用的是9600 115200…..
以9600为例:
9600指的是串口通讯1秒可以通讯数据9600个bit位。 所以1bit的时间是1/9600 秒 = 0.000104166秒 = 0.104166毫秒;
3、扩展知识1: IO模拟实现串口数据发送
单片机如果没有集成串口功能,我们就可以通过定时器+1个IO口模拟 /或delay延时函数+一个IO口实现串口发送功能;
举例代码:(通过51单片机的P4.0实现串口数据的发送)
(注:本部分内容需要先自行分析以下代码,在结合视频学习)
P40 = 1; //在单片机刚上电IO初始化的时候 初始化 TXD空闲为高电平;
void UsartTxdDat(unsigned char dat)
{//无校验 8bit 1停止位 波特率:9600 举例 0x32 0011 0010
unsigned char i
P40 = 0; //起始位 拉低
delay0104ms(); //延时0.104166毫秒;
P40 = 1; //起始位 结束;
for(i=0;i<8;i++)
{//假如dat = 0x32; 0011 0010
P40 = (dat & 0x01);
//i= 0; 0011 0010 & 0000 0001
//i= 1; 0001 1001 & 0000 0001
//i= 2; 0000 1100 & 0000 0001
//i= 3; 0000 0110 & 0000 0001
//i= 4; 0000 0011 & 0000 0001
//i= 5; 0000 0001 & 0000 0001
//i= 6; 0000 0000 & 0000 0001
//i= 7; 0000 0000 & 0000 0001
delay0104ms(); //延时0.104166毫秒;
dat >>=1;
//i= 0; 0001 1001
//i= 1; 0000 1100
//i= 2; 0000 0110
//i= 3; 0000 0011
//i= 4; 0000 0001
//i= 5; 0000 0000
//i= 6; 0000 0000
//i= 7; 0000 0000
}
P40 = 1; //停止位开始;
delay0104ms(); //延时0.104166毫秒;
P40 = 1; //停止位 结束;
}
4、扩展知识2:波特率容错(误差)
由于定时器定时精度的缘故,实际bit位时间 和理论bit 位时间有可能是不一样的,两个之间的误差,我们称为波特率的容错,理论容错率小于 4%。
如果波特率容错率较高,无法处理时,可以增加数据校验配合处理;
问题:51单片机的时钟为什么比较常见的是11.0592M?为了降低串口的容错率;
系统时钟11.0592M,波特率误差: 0%
系统时钟12M,波特率误差: 0.16%
三、 串口的代码实现:
串口通讯虽然比较常见,但为什么工程师很少去研究和了解串口通讯协议?因为单片机内部已经集成了串口通讯的硬件。工程师只需要按照芯片厂家提供的例程配置相关参数即可。
大家掌握了单片机如何配置串口的参数就可以完成串口的程序的初始化开发;
以STM32单片机为例:
USART_InitStructure.USART_BaudRate = 9600; //波特率
//#define USART_WordLength_8b ((uint16_t)0x0000)
//#define USART_WordLength_9b ((uint16_t)0x1000)
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
//#define USART_StopBits_1 ((uint16_t)0x0000)
//#define USART_StopBits_0_5 ((uint16_t)0x1000)
//#define USART_StopBits_2 ((uint16_t)0x2000)
//#define USART_StopBits_1_5 ((uint16_t)0x3000)
USART_InitStructure.USART_StopBits = USART_StopBits_1;
//#define USART_Parity_No ((uint16_t)0x0000)
//#define USART_Parity_Even ((uint16_t)0x0400)
//#define USART_Parity_Odd ((uint16_t)0x060
USART_InitStructure.USART_Parity = USART_Parity_No;
//#define USART_HardwareFlowControl_None ((uint16_t)0x0000)
//#define USART_HardwareFlowControl_RTS ((uint16_t)0x0100)
//#define USART_HardwareFlowControl_CTS ((uint16_t)0x0200)
//#define USART_HardwareFlowControl_RTS_CTS ((uint16_t)0x0300)
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(DEBUG_USART_PORT, &USART_InitStructure);
USART_InitStructure.USART_BaudRate = 9600; //波特率
//#define USART_WordLength_8b ((uint16_t)0x0000)
//#define USART_WordLength_9b ((uint16_t)0x1000)
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
//#define USART_StopBits_1 ((uint16_t)0x0000)
//#define USART_StopBits_0_5 ((uint16_t)0x1000)
//#define USART_StopBits_2 ((uint16_t)0x2000)
//#define USART_StopBits_1_5 ((uint16_t)0x3000)
USART_InitStructure.USART_StopBits = USART_StopBits_1;
//#define USART_Parity_No ((uint16_t)0x0000)
//#define USART_Parity_Even ((uint16_t)0x0400)
//#define USART_Parity_Odd ((uint16_t)0x060
USART_InitStructure.USART_Parity = USART_Parity_No;
//#define USART_HardwareFlowControl_None ((uint16_t)0x0000)
//#define USART_HardwareFlowControl_RTS ((uint16_t)0x0100)
//#define USART_HardwareFlowControl_CTS ((uint16_t)0x0200)
//#define USART_HardwareFlowControl_RTS_CTS ((uint16_t)0x0300)
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(DEBUG_USART_PORT, &USART_InitStructure)
硬件数据流控制(了解):数据流控制 一般很少用到,这个和电脑后端的串口接口相关;
四、 usart 和uart的关系:
uart: 串口异步通讯 (Universal Asynchronous Receiver/Transmitter)
usart:串口同步/异步通讯 (Universal Synchronous Asynchronous Receiver/Transmitter)
先讲解异步通讯和同步通讯的区别:
同步通讯:数据发送和接收采用同一个时钟通讯。例如SPI,IIC等;
异步通讯:数据发送和接收的时钟独自提供;
例如:单片机和4G模块之前采用串口通讯.
STM32 单片机采用同步通讯的硬件连接图:(CK :时钟脚)
STM32单片机串口通讯接口:
五、 单片机串口和电脑串口RS232 (了解)
1. TTL电平、COMS电平和RS232电平
TTL电平(晶体管-晶体管逻辑电平 ):单片机IO电平,(这里特指单片机串口电平),
高电平:单片机VCC,低电平:0V
(输出高电平>2.4V,输出低电平<0.4V 输入高电平>=2.0V,输入低电平<=0.8V)
COMS电平:单片机IO电平(这里特指单片机串口电平)COMS逻辑电平
高电平:单片机VCC,低电平:0V
( 高电平接近于电源电压,低逻辑电平接近于 0V )
RS232电平: 9针串口接口通讯的电平,高电平(逻辑“1):-5V~-15 V 低电平(逻辑“0):+5 V~+15 V
2.单片机串口电平和RS232电平转换
单片机和电脑串口(如下图)通讯,需要电平转换芯片RS232 MAX232
由于电脑后端的串口接口在新的电脑上逐步被淘汰,所以这部分内容,建议大家有一个了解即可。目前一般都采用 串口和USB通讯(专用芯片:CH340 CP2102 FT232 PL2303)
六、 串口和RS485
1、 RS485硬件通讯接口
2、 RS485电平逻辑
高电平(逻辑1): AB两线间的电压差(+2V–+6V )
低电平(逻辑0):AB两线间的电压差(-6V—2V)
由于RS485通讯是半双工通讯,所有在控制端需要有一个使能脚CE
3、 RS485和单片机串口通讯
RS485和单片机通讯电路:
单片机串口电平和RS485电平电压不一样,需要一个电平转换芯片,通过硬件实现电平的转化,比较常用的芯片:RS485 或Max485芯片.
如上图;由于RS485通讯是半双工的,RS485通讯的时候,需要一个发送和接收的使能脚来控制数据的发送和接收。P1.0=0,低电平的时候,处于数据接收状态,P1.0 高电平处于数据发送状态。 R0 和DI 直接连接单片机的串口连接; 以上电路需要注意单片机的供电电压 和RS485的供电电压要一致,否则可能会导致通讯异常。
也可以采用以下电路:
七、 总结说明
①问题1:串口通讯采用TTL电平 或RS232电平,都是全双工的,为什么要用RS485半双工的通讯方式呢?
理论上:RS232传输距离小于 15米 RS485传输距离小于1200米 单片机串口通讯距离大概几米;
正常情况下,通讯距离比较:单片机串口 < RS232 < 485
②单片机串口 和RS232 通讯一般是 一对一通讯。 RS485支持总线通讯,如下图:
<结束>