物理层:规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。其实就是硬件部分。
协议层:协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。其实就是软件部分。
简单来说物理层规定我们用嘴巴还是肢体来交流。
写一层规定我们用中文还是用英文来交流。
补充:USART中“S”指的是同步(synchronization)。
这里先说一下RS-232电平和TTL电平的区别:
TTL:直接从单片机或者直接从芯片出来的电平都叫TTL电平。高电平又5V或3.3V来表示。
RS-232: 如上图,RS-232电平用-15V来表示高电平(也就是1),由+15V来表示低电平(也就是0)
RS-232标准串口通讯结构图:
如图是两个设备的通讯(设备A和设备B),控制器A有两根线,一个发送一个接收,输出的TTL电平需经过一个电平转换芯片将TTL电平转换为RS-232电平,由DB9接口传输给设备B的DB9接口,然后在经过电平转换芯片将转换好的TTL电平送给控制器B。
DB9公头及母头:
关于DB9接口,有兴趣的可以搜一下专门介绍这个的文章。
RS232,RS485 标准DB9接口(串口通信线标准接口)
①RS232标准串口主要用于工业设备直接通信。工业设备可能静电比较多,还有震动,粉尘等,用-15V表示1,-15V表示0,峰峰值是30V,所以容错能力很强。
⑤电平转换芯片一般有MAX232,SP3232。
①USB转串口主要用于设备跟电脑通信。
②电平转换芯片一般有CH340、PL2303、CP2102、FT232。
③使用的时候电脑端需要安装电平转换芯片的驱动。
①原生的串口通信主要是控制器跟串口的设备或者传感器通信,不需要经过电平转换芯片来转换电平,直接就用TTL电平通信。
②GPS模块、GSM模块、串口转WIFI模块、HC04蓝牙模块。
结束位:由0.5个、1个、1.5个或2个逻辑1的数据位表示。
有效数据:在起始位后紧接着的就是有效数据,有效数据的长度常被约定为5、6、7或8位长。
校验位:可选,为的是数据的抗干扰性。
校验方法分为:
1-奇偶校验(odd)、2-偶校验(even)
3-0校验(space)、4-校验(mark)
5-无校验(noparity)
奇校验(odd):有效数据和校验位中“1”的个数为奇数
比如一个8位长的有效数据为:01101001,此时总共有4个“1”,为达到奇校验效果,校验位为“1”,最后传输的数据将是8位的有效数据加上1位的校验位总共9位。
偶校验(even):有效数据和校验位中“1”的个数为偶数
比如一个8位长的有效数据为:01101001,此时总共有4个“1”,为达到偶校验效果,校验位为“0”,最后传输的数据将是8位的有效数据加上1位的校验位总共9位。
0校验是不管有效数据中的内容是什么,校验位总为“0”。
1校验是校验位总为“1”。
无校验就是数据包中不包含校验位。
由图可以看出,USART有8个引脚,分别是:TX(数据发送)、RX(数据接收)、SCLK(时钟,仅同步通信时使用,但是我们一般使用异步,所以一般不使用这个时钟)、nRTS(请求发送)、nCTS(清除发送),“n”表示低电平有效,nRTS和nCTS这两个引脚也很少用。SW_RX、IRDA_OUT、IRDA_IN这些引脚也很少用,如果需要用到的话,可以查对应的IO引脚分配表。
字长可以通过编程USART_CR1寄存器中的M位,选择8或9位。在起始位期间,TX脚处于低电平,在停止位期间处于高电平。
其中n个停止位中的“n”是不确定的,它可以通过USART_CR2的STOP位来配置:
我们常用的是1个停止位。
可能的奇偶校验位由USART_CR1的PCE、PS和PEIE位配置:
先设置PCE(校验控制使能)位进行使能,使能后再设置PS(校验选择)位决定是奇校验还是偶校验,使能PEIE(PE中断使能)位在校验结果和预期的结果不一样时产生中断。 产生中断以后就会有相应的标志位置位,就是USART_SR的PE位置位:
将该位置为1表示奇偶校验出错。
数据寄存器:USART_DR,9位有效,包含一个发送数据寄存器TDR和一个接收数据寄存器RDR。一个地址对应了两个物理内存。TDR寄存器提供了内部总线和输出移位寄存器之间的并行接口,RDR寄存器提供了输入移位寄存器和内部总线之间的并行接口。
发送数据之前需要先设置USART_CR1的UE、TE和RE位:
UE(USART使能)位设为1则USART使能,即打开串口。
发送数据:
设置UE=1,TE=1,
发送的数据可以来自CPU或来自DMA请求,将数据写入到发送数据寄存器(TDR)中,然后发送数据寄存器里的数据会发送到发送移位寄存器中,这时候USART_SR寄存器的TXE位会被置1;然后发送移位寄存器会将数据一个bit一个bit发到TX端。当数据发送完成后USART_SR寄存器的TC位会被置1。
接收数据:
UE=1,RE=1。
外部设备的数据由RX传到接收移位寄存器,当接收移位寄存器里的数据全部发送到接收数据寄存器后,USART_SR的RXNE位置1,表示数据已经收到,可以读出了。
还有一些和发送接收数据相关的寄存器(都在USART_CR1中):
波特率是由波特比率寄存器(USART_BRR)设置的。
这是波特率的公式:
所以我们要设置波特率,只要算出USARTDIV的值就行,算出以后写入到USART_BRR寄存器中就设置好波特率了。下面是一些计算USARTDIV的例子: