首先比较一下串行通讯和并行通讯的特点。
并行通讯的特点:接线较多,速度快,控制简单。
串行通讯的特点:接线少,速度慢,控制复杂。
一、串口通讯的传输方向:
(1)单工:数据传输仅能沿一个方向。不能事项反向传输。
(2)半双工:数据传输可以沿两个方向,但需要分时进行。
(3)全双工:数据可以同时进行双向传输。
半双工的通讯实例(RS485通讯电路):
一个数据通道,是差分信号,由A线和B线共同构成。
接收管脚1,发送管脚4,方向控制管脚2、3,当方向控制管脚拉低时,允许485总线上的数据传到单片机(左边);当方向控制管脚拉高,允许单片机向485总线上发送数据。
倘若有很多设备挂在485总线上,这些设备在同一时刻只有一个设备处在发送状态,其他设备都处于接收状态。如果在同一时刻有两个或两个以上设备处于发送状态会导致485总线错误,通讯失败。因此设计电路和编写程序都要注意。在每次单片机发送数据完毕后要把发送管脚的电平拉低,不允许485总线上其他设备发送数据。
二、串行通信的类型:
(1)同步通信:指发送方在同步时钟的控制下,将数据逐位发出去,接收方在同步时钟控制下逐位接收,如SPI,IIC等。
(2)异步通信:指双方要线约定好通讯格式,如:波特率,数据格式(位数,有无起始位、停止位个数、有无校验位)如UART,单总线通讯(DS18B20)
三、Stm32f4 串口通讯程序编程:
1. 新建串口通讯模块文件:SCI.C和SCI.H
2. 编写 SCI.C和SCI.H文件
(1) 开启 USART1时钟 :RCC_APB2PeriphClockCmd
(2) 开启GPIOA时钟:RCC_AHB1PeriphClockCmd
(3) 配置GPIOA Pin9和Pin10为串口功能:GPIO_Init和GPIO_PinAFConfig
(4) 初始化串口参数:USART_Init
(5) 串口中断配置:USART_ITConfig
(6) 中断优先配置:NVIC_PriorityGroupConfig和NVIC_Init
(7) 使能串口:USART_Cmd
(8) 串口中断函数编写
(9) 在main函数中调用串口初始化
下面是一丝不苟的截图:
四、串口通讯的优化:
1. 文件优化:增加NVIC模块
2. 中断函数优化:中断函数内做的事情越少越好也就是说中断函数的运行时间越短越好
3. 变量优化
Volatile 的使用: volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能有货读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。
一般来说寄存器的暂时值和这个变量直接地址上存放的值是相等的,但是对于如果在中断中改变的变量那么这个值的暂存值和直接地址上存放的值可能不相等。
一下是一本正经的截图:
将中断从USART_Init中拿出来作为一个中断函数的模块。
NVIC.C文件:
定义两个全局变量:
用以:
这样,主函数整洁就如下图所示:
用户1734959 2016-3-10 23:50