5.STM32的串口通信
两个串口之间的通信
发送端口:TX 接受端口:RX
- 注意一台设备的TX 与 另一台RX相连接
- 共地:还需要将两端地线相连接,将设备的参考电势在同一水平(通讯的前提)
建立连接
在cubeIDE中 图形化界面 -> Connectivity -> USART2 -> 将mode改为Asynchronous(异步模式),此时STM32引脚上的PA2和PB3分别被设置为了USART2_TX 和 USART2_RX 就成功将单片机通过数据线和串口与另一端建立连接。
再出现的参数中注意
Baud Rate (波特率) 指的是每秒发送多少次高低电平信号(每秒传送的码元数量),默认情况下,TTL串口没传递一个字节(Byte)也就是8bit的数据,再将数据再加上起始位1,停止位0,也就是传送一字节的信息需要10bit
所以115200bit/s的波特率下 1秒钟可以传递11520 字节的数据。
其他常见波特率 9600 19200 38400 通信的两设备需要使用相同的波特率才能正常通信
其他参数保持默认,ctrl+s保存
在生成的函数中,自动初始化了串口2 ,设置了比特率为115200
串口的轮询模式
串口发送函数
HAL_UART_Transmit(huart,pDate,Size,Timeout);
huart:要操作的串口指针,注意不是指针则需要取地址符
pDate:需要发送的信息的指针,需要类型uint8_t 强制转化(uint8_t *)char类型与uint8_t相同
Size :需要发送的数组长度,通常用sizeof()函数取出pDdate的长度。
Timeout:超时时间,多久之后还没有发送完成的话,就停止发送。最大值HAL_MAX_DELAY无限等待。
串口接收函数
HAL_UART_Receive(huart,pDate,Size,Timeout);
huart:要操作的串口指针,注意不是指针则需要取地址符
pDate:需要接受的变量的指针,需要类型uint8_t
Size:需要接收的数组长度,也就是指令长度,如2,3 ,4
Timeout:超时时间
轮询模式的优缺点
必须要阻塞程序的执行,直到完成发送或接收,或者等待超时
轮询模式的串口发送
调用函数HAL_UART_Transmit发送一段数据时,STM32的CPU会依次将数据移到寄存器中,发送移位寄存器中的数据会按照我们设定的比特率转化为高低电平从TX引脚输出,发送数据寄存器中的数据会在发送移位寄存器发送完成后,被移动到发送移位寄存器进行下一次发送,而在此过程中,CPU需要不断去查询,发送数据寄存器中的数据是否已经移送到发送移位寄存器,移了的话就赶紧把一下数据塞进来如果没有移动,就不断查询,知道把本次要发送的数据全部发完,或用时超过我们设定的超时时间
轮询模式的串口接收
原理同发送
可以看到在轮询模式下,不管是发送还是接收CPU一直处于忙碌状态,查询一直等待暂时无法向下执行的状态为“堵塞”,如何解决这种长期占用CPU的堵塞问题
串口的中断模式
只有当发送移位寄存器发送后,触发“发送数据寄存器空”中断,才会让CPU来处理发送数据寄存器,cpu在中断处理函数中将数据塞入发送数据寄存器后,就可以去处理其他代码,大大减少了cpu占用时间
操作步骤
1.在图形界面打开USART的中断功能
中断发送
HAL_UART_Transmit_IT(huart,pDate,Size);
则不需要等待时间参数,其他参数与轮询发送相同。
中断接收
HAL_UART_Receive_IT(huart,pDate,Size);
- 在代码中,不可直接使用,其中断模式会未接收完毕就继续往下执行,不能再其运行后就立即对数据进行分析
如何知道数据接收完毕,在对数据进行处理,前面说到每当发送移位寄存器发送后,会触发一次“发送数据寄存器空”中断,该函数位置在
stm32f1xx_it.c文件中,每当中断处理时,会调用下面的函数
打开HAL_UART_IRQHandler(&huart2)内部中的一个函数
这个函数会在接收完成时就会调用,就能实现在串口接收完成后的第一时刻,对数据进行分析处理了。__weak 函数可以在程序任意位置重新定义
将处理逻辑移入到HAL_UART_RxCpltCallback中即可
-
注意需要将接收字符串设置在usercode PV变量中。提升为全局变量
-
HAL_UART_RxCpltCallback写在main.c的userCode0中
整个代码就3句,其背后的代码逻辑,需要理解。
代码逻辑:
使用HAL_UART_Receive_IT()函数接收来自huart2的消息, HAL_UART_Receive_IT()在中断接收完整的message后触发HAL_UART_RxCpltCallback()串口接收回调函数,将接收到的message通过HAL_UART_Transmit_IT()中断发送消息,之后HAL_UART_Receive_IT()进行等待串口中断接收下一条消息。
通过中断我们成功解决了串口操作一直占用CPU的问题。
但如何接收不确定长度的数据,能否进一步减少CPU的占用呢?
使用扩展函数即可实现,使用DMA搬运数据,下期再见。
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » 5.STM32的串口通信
发表评论 取消回复