这一期教程的内容主要是在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。
可以看到程序确实是按照我们要求返回结果。