当前位置: 首页 > article >正文

5.STM32的串口通信

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搬运数据,下期再见。


http://www.kler.cn/news/343424.html

相关文章:

  • 七大排序详解
  • 【C++图文并茂】01背包问题不会?超详细的详解,看完保证你会
  • Bean,看到P188没看了与maven
  • Qt文件对话框、颜色对话框、字体对话框、输入对话框
  • 【js逆向学习】极志愿 javascript+python+rpc
  • YOLOv10改进策略【注意力机制篇】| CVPR2024 CAA上下文锚点注意力机制
  • DBeaver的安装与使用
  • 11月EI学术会议推荐
  • 35.反转链表
  • python 实现bfs 最短路径算法
  • python中的数组模块numpy(一)(适用物联网数据可视化及数据分析)
  • 【VUE】defineProperty和proxy的区别
  • 股市和期市历史分钟以及均线策略高级用法
  • 1.GoLang概述开发环境
  • 杂谈--Linux是什么用途?
  • 【java应用系统连接自有https证书(无法验证)的minio服务时报错问题处理过程】
  • JAVA中线程的生命周期
  • 将JSON的格式数据存储到数据库中
  • Jetpack Compose 页面跳转 - 导航Navigation使用和封装
  • 共识算法Raft