首页 > 其他分享 >STM32F4平台使用SerialPort串口库教程

STM32F4平台使用SerialPort串口库教程

时间:2024-05-27 13:01:37浏览次数:26  
标签:头文件 函数 C++ SerialPort 串口 STM32F4 RobotMain

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

标签:头文件,函数,C++,SerialPort,串口,STM32F4,RobotMain
From: https://blog.csdn.net/weixin_43026921/article/details/139234086

相关文章

  • 嵌入式实时操作系统笔记3:FreeRTOS移植(STM32F407)_编写简单的FreeRTOS任务例程
    上文讲到UC/OSIII系统的移植,那篇文章是失败了的,网络上的资料真是层次不清,多有遗漏步骤,导致单片机连操作系统的初始化都卡在那,这次换个赛道,学FreeRTOS吧......今日任务如标题所示:FreeRTOS移植(STM32F407)_编写简单的FreeRTOS任务例程文章提供测试代码讲解、完整工程下载、测......
  • 【STM32】串口不定长接收 保姆级教程
    为什么要使用串口不定长接收正常的接收函数HAL_UART_Receive(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize,uint32_tTimeout)huart:句柄pData:盛放接收数据的变量Size:接收数据的大小中断接收函数HAL_UART_Receive_IT(UART_HandleTypeDef*huart,uint......
  • Python串口控制MS伺服电机(多圈角度)
    """多圈电机转动模式1"""defdecimal_to_hex_bytes(decimal_number,byte_size):#检查字节大小参数的有效性valid_sizes={"int8":1,"int16":2,"int32":4,"int64":8}ifbyte_sizenotinval......
  • qt一个在线程管理的串口
    qt一个在线程管理的串口 #include<QObject>#include<QSerialPort>#include<QSerialPortInfo>#include<QDebug>#include<QFile>#include<QTextStream>#include<QThread>#include<QTimer>#include<QEventLoop>......
  • C#串口通讯 源码Demo
    在C#中进行串口通讯主要涉及到以下几个步骤:引入命名空间usingSystem.IO.Ports;创建SerialPort对象SerialPortport=newSerialPort();设置串口属性//设置串口名:port.PortName="COM1";//设置波特率:port.BaudRate=9600;//设置校验位:port.Parity=Parity.None;//......
  • Mobexterm 串口换行错误
    问题描述使用Mobexterm连接串口时,在回显中存在换行错误问题,严重影响阅读串口数据。解决方法在左侧操作窗口中右击发生换行错误问题的窗口,比如我需要右击COM9右击后,在下拉列表中选择Editsession在该窗口下方三个选择项中,选择Terminalsettings,继续选择Expor......
  • QT使用串口通信点击主界面通信阻塞
    1.问题导入在使用QT进行串口上位机开发时遇到鼠标点击主界面导致串口接收数据阻塞,无法继续在QT控件中更新接收到的数据。2.解决办法使用多线程:将串口通信放入子线程中。`QSerialPort*UARTDevide;//串口UART*newUART;//串口类QThreadUARTThred;//串口线程newUART->mo......
  • ESP8266串口WiFi模块 - WiFi杀手
    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解`ESP8266串口WiFi模块-WiFi杀手日期:2020-2-3阿珏折腾代码浏览:2635次评论:21条前段时间买了个ESP8266,准备拿来耍耍。实际吃灰数月,然后就拖到......
  • vb.net 查看本地计算机串口
    vb.net查看本地计算机串口在VB.NET中,您可以使用System.IO.Ports.SerialPort类来查看本地计算机的串口。以下是一个简单的示例代码,用于列出所有可用的串口名称:代码1ImportsSystem.IO.PortsModuleListSerialPortsModuleSubMain()DimportNamesA......
  • (10)uart串口通信
    一、uart简介  二、uart串口通信实验 其中:sys_clk为系统时钟。uart_rxd为串口从上位机接收到的数据,当检测到uart_rxd出现下降沿(起始位),start_flag产生正向脉冲,rx_flag也被拉高,clk_cnt为时钟计数器,由0计数到433,rx_cnt为接收数据计数器,当计数到第九位且......