目录
话不多说,直接上教程
文章末尾附源代码
这是 usart_dma.h 文件,里面都是配置所需功能的宏定义及串口相关的初始化函数和功能函数
配置的方法都·已经注释说明了,只需要启用需要使用的串口或者禁用不需要使用的串口即可
usart_dma.c 文件不用管 只需要配置该头文件就能使用了
各函数的功能及使用方法
1.串口调试输出
void debug(char* p, ...); //串口调试输出
2. 串口调试输出 接口设置
#define PRINTF 1 // 1: 启用串口1调试输出 2: 启用串口2调试输出
// 3: 启用串口3调试输出 4: 启用串口4调试输出
// 5: 启用串口5调试输出 其他:禁用串口调试输出
3. 串口格式化输出
/******************************************************************************
*方法名称: void User_Printf(UART_HandleTypeDef *huart,char *p,...)
*功能: 使用指定的串口格式化输出
*参数: * huart :用来输出数据的串口句柄
* p, ...:需要输出的数据
*返回: 无
*说明: 无
*******************************************************************************/
void User_Printf(UART_HandleTypeDef *huart,char *p,...); //串口格式化输出
4.用户串口DMA中断初始化函数
/******************************************************************************
*方法名称: void User_USART_UART_Init(UART_HandleTypeDef huart);
*功能: 串口初始化输出
*参数: 串口对应的 huart 句柄
*返回: 无
*说明: 用户串口DMA接收模式初始化函数
需在系统串口初始化函数 MX_USARTx_UART_Init(void) 结束时调用
*******************************************************************************/
void User_USART_UART_Init(UART_HandleTypeDef huart);
// 用户 串口DMA接收模式初始化函数需在 系统初始化函数 MX_USARTX_UART_Init(void) 函数结束时调用
使用方法
1.找到系统的串口初始化函数
2.在结束位置添加我们的串口初始化函数
我这是在函数内部调用,你们也可在main函数中直接调用,只需保证在系统初始化函数后面就行
5.用户中断回调函数
/******************************************************************************
*方法名称: void User_UART_RxCpltCallback(UART_HandleTypeDef *huart)
*功能: 串口回调函数 重新开启串口DMA接收
*参数: *huart: 串口对应的 huart 句柄
*返回: 无
*说明: 用户串口中断回调函数
需在系统中断函数 USARTx_IRQHandler() 结束时调用
*******************************************************************************/
void User_UART_RxCpltCallback(UART_HandleTypeDef* huart);
//用户 串口中断回调函数 需在系统中断回调函数 USARTx_IRQHandler() 函数结束时调用
使用方法
1.找到系统的中断服务.c文件 打开
2.找到串口中断服务函数 在结束位置添加我们的中断服务函数
6.校验字符串函数
/******************************************************************************
*方法名称: unsigned char hand(char* rec_data,char *ptr)
*功能: 校验字符串 rec_data 是否包含字符串 ptr
*参数: rec_data :需要校验的字符串
ptr :需要包含的字符串
*返回: 校验结果 1:包含 0:不包含
*说明: 无
*******************************************************************************/
unsigned char hand(char* rec_data,char *ptr);
//校验字符串 rec_data 是否包含字符串 ptr 校验结果 1:包含 0:不包含
CubeMx 串口配置
1.配置串口基本参数
2.开启串口DMA
3.打开串口中断
4.在NVIC中配置中断优先级![](https://img-blog.csdnimg.cn/0b5fc86cb13346678b05a5ffc9c19cd3.png)
实际应用
void usart3(void)
{
/**************************************** 从这里添加串口3功能代码 ****************************************/
if ( (USART_RX_STA & ~(0x0001<<2)) != 0) //串口3接收到数据
{
USART_RX_STA &= ~(0x0001<<2); //串口3清标志位
if (hand((char *)u3NewBuffer, "QRcode")) //串口收到的数据是否包含 "QRcode"
{
destination=My_Atoi((char *)u3NewBuffer); //如果包含则执行这条代码
}
User_Printf(&huart1, "usart3:%s \n ", u3NewBuffer); //使用串口1发送串口3接收到的数据
memset(u3NewBuffer, '\0', strlen((char *)u3NewBuffer)); // 清除串口3缓存数据
}
}