串口通信基础原理
串口常用电平标准:
-
波特率:串口通信的速率
注:波特率(每秒传输码元数,码元/s)和比特率(每秒传输的比特数,bit/s)只在二进制调制 下等效,此时一个码元 = 一个bit。
-
起始位:标志一个数据帧的开始,固定为低电平。(下降沿开启)
-
数据位:数据帧的有效载荷,低位先行。
-
校验位:用于数据验证。奇校验在第九位补0/1,使得整个数据帧1的个数为奇数,偶校验同理。
-
停止位:用于数据帧间隔,固定为高电平。
USART 通用同步/异步收发器
USART是STM32内部集成的硬件外设,可从数据寄存器的一个字节自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接位一个字节数据,放在数据寄存器中。
USART外设就是串口通信的硬件支持电路。
usart部分结构图:
串口打印操作实验(阻塞发送版本)
串口的阻塞发送,就是调用HAL_UART_Transmit()函数
第一个参数:要使用的串口句柄。
第二个参数:发送数据的地址
第三个参数:发送数据的大小,发送一个字符就是1。
第四个参数是等待时间。这个等待时间就是串口阻塞发送的精髓,它在串口正在发送的时候,是将整个任务阻塞,直到等待时间结束。如果设置等待时间为0xffff,就是一直等到数据发送完,才会继续执行其他代码。
封装一下直接调用即可:
执行效果如图所示:
如果要发送字符串/数组,使用一个for循环即可。
串口打印操作实验(中断发送版本)
串口的中断发送,就是调用HAL_UART_Transmit_IT()函数
第一个参数:要使用的串口句柄。
第二个参数:发送数据的地址
第三个参数:发送数据的大小,发送一个字符就是1。
中断发送区别于阻塞发送就是在于等待时间。
当程序执行了HAL_UART_Transmit_IT()之后,不会等待数据发送完,就会立即执行下一条代码,而发送字符串的工作就放在中断中去执行。这样就保证了整个任务不会因为等待串口发送而阻塞。
在触发中断之后,
判断中断标志置一之后,
回调函数是一个虚函数,由我们自己重新定义。在发送完第一个字符之后,程序会进入到这里,我们可以按照我们要的需求自定义代码内容,比如发送完一个字符置一个标志位,或者是继续在这里发送下一个字符,如果我们什么也不做就空着就好。
封装一下代码即可使用:
执行效果如图所示:
如果要打印字符串,可以使用for多次调用,也可以在中断回调函数HAL_UART_TxCpltCallback中去继续发送剩余字符。
参数文献:江协科技教程