STM32F4平台使用SerialPort串口库教程

这一期教程的内容主要是在STM32F4平台使用SerialPort串口库和上位机通信,上位机(例如串口调试助手)向下位机发送字符串,下位机接收到字符串后,经过加工处理再发送给上位机。SerialPort串口库使用C++编写,用户只需在外部实现4个中断回调函数即可完成串口DMA收发,然后使用read函数读取串口数据,write函数向串口写入数据。SerialPort自带串口DMA接收缓冲区,可以实现高速数据接收功能。

创建Clion工程

具体创建方法请参考STM32F4平台导入RDK库教程

配置串口1

在STM32CubeMX中打开USART1。
在这里插入图片描述
开启串口1的全局中断。
在这里插入图片描述

配置DMA

点击”DMA Settings“进入DMA设置界面。
在这里插入图片描述
点击“Add”添加“USART1_RX”。
在这里插入图片描述
优先级选择“Very High”。
在这里插入图片描述
波特率的话就默认115200就行。
在这里插入图片描述

打开Clion工程

导入RDK库

具体导入方法请参考STM32F4平台导入RDK库教程

使用C++编程

由于RDK库采用C++编写,而STM32CubeMX生成的代码是C语言编写的,所以我们需要在工程里新建C++代码文件,然后导出C语言能够识别的C++函数,再在main.c中的main函数里调用导出的C++函数,就能实现将程序控制权转交给C++,然后就可以自由地编写C++代码了。

新建RobotMain.h

在Inc目录右键,选择"New"->“C/C++ Header File”。
在这里插入图片描述
文件名填写“RobotMain”。这里的“Add to targets”勾不勾选无所谓,到时候cube重新生成代码也会重新生成CMakeLists.txt。然后点击“OK”。
在这里插入图片描述
在这里插入图片描述
他会提示当前文件不属于这个工程。在项目根目录“Demo”右键单击“Reload CMake Project”。
在这里插入图片描述
然后就不会出现这个警告了。
在这里插入图片描述
将RobotMain.h文件的内容改成:

//
// Created by Mac on 2024/5/27.
//

#pragma once

#ifdef __cplusplus
extern "C"
{
#endif

    void RobotMain();

#ifdef __cplusplus
};
#endif

在这里插入图片描述
第一行的#pragma once表示这个头文件只允许被包含一次。如果这个头文件被C++程序包含,则会定义__cplusplus,在"extern “C” {}"中定义的C++函数符合C语言的函数调用规范,最终链接时c语言编写的程序就能够识别这个函数。

新建RobotMain.cpp

在Src目录右键点击“New”->“C/C++ Source File”。
在这里插入图片描述
文件名填写“RobotMain”然后点击“OK”。
在这里插入图片描述
在RobotMain.cpp中编写下面代码:

//
// Created by Mac on 2024/5/27.
//

#include "RobotMain.h"


void RobotMain()
{

    
}

在这里插入图片描述

在main.c中调用C++函数

打开main.c,在Private includes代码沙箱中包含RobotMain头文件。
在这里插入图片描述
然后在main()函数末尾死循环前面的代码沙箱内调用RobotMain(),你也可以在RobotMain()中写上死循环。
在这里插入图片描述
到这里就实现了将C语言编程转变成C++编程,我们只需要在RobotMain函数中编写C++代码去调用其他C/C++代码。

使用SerialPort

SerialPort简介

SerialPort类定义如下:
在这里插入图片描述
在构造SerialPort对象时,我们需要传入一个串口句柄。然后在外部实现4个stm32中断函数,在中断函数里分别调用SerialPort中以On开头的函数,即我们只需要实现中断请求转发。
start()函数是开启串口传输功能。
async开头的函数是异步读写功能,调用这个函数立即返回结果,当传输完成后再通过ResultHandler通知用户。
不带async的read,write则是阻塞函数,可以指定超时时间,单位毫秒。

声明SerialPort对象

由于我们使用到C++中的智能指针,所以请先在头文件中包含智能指针头文件。

#include <memory>

在这里插入图片描述
然后包含hal库的串口头文件和RDK库的串口头文件。
在这里插入图片描述
在RobotMain.cpp中使用智能指针声明SerialPort对象。
在这里插入图片描述
在RobotMain()函数中构造SerialPort对象。然后调用start()方法开启串口通信。
在这里插入图片描述
在RobotMain函数前面实现4个HAL库定义的中断函数。
在这里插入图片描述
然后在这4个中断函数中分别将中断请求转发到SerialPort对象。
在这里插入图片描述

接收串口数据

在RobotMain中编写下面的代码,接收上位机发来的以’\n’换行符结尾的字符串。
在这里插入图片描述

发送串口数据

由于会用到strlen,snprintf函数,所以请在RobotMain.h头文件中函数包含stdio和string头文件。
在这里插入图片描述
将接收到的字符串前面加上#,末尾加上!再发送回上位机。
在这里插入图片描述

将stlink插上电脑并连接好单片机,点击小三角编译运行。
在这里插入图片描述
出现下面这个提示则说明烧录成功。
在这里插入图片描述
在这里插入图片描述
如果开发板上带有串口转USB的则可以直接使用数据线和电脑相连。
在这里插入图片描述

使用串口调试助手测试收发功能

打开串口调试助手,选择对应的串口和参数。
在这里插入图片描述
随便发送字符串,比如Hello World。
在这里插入图片描述
在这里插入图片描述可以看到程序确实是按照我们要求返回结果。

  • 24
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值