04-CubeMX串口通信

本文介绍了如何使用CubeMX配置串口通信,包括设置波特率、中断和DMA,以及设计和实现简单的串口发送和接收。还提及了利用union结构优化通信协议的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、 CubeMX配置

1.首先根据本专题栏0节完成CubeMX的基本配置。理论部分可以参考正点原子HAL库版本视频。
2.根据自己的引脚打开相应的串口 PA9,PA10为UART1。
3.选择同步或者异步通信。
4.设置对应的波特率、收发模式等。同时根据需要是否打开中断(NVIC)和DMA、。
4完成设置点击生成代码。
在这里插入图片描述

2、 代码配置

串口通信可以根据不同的要求设计不同的通信协议。通信协议通常包括header,data,verify_data ,end_flag等。可以根据自己需求配置。

2.1串口接收

1.一般设置接收中断,即当串口RX端接收到数据后久进入中断函数。通信协议可以在中断函数中写。
2.但通常是进入中断,中断会条用调用中断回调函数,在中断回调函数中写用户程序。

3.需要特别注意的是需要在主函数中打开中断使能

HAL_UART_Receive_IT(&huart1,revbuf,sizeof(revbuf)); //句柄,缓存地址,数据缓存大小

2.2串口发送

1.串口通信发送数据代码

HAL_UART_Transmit(&huart1,timr,sizeof(timr),10000);	//句柄,发送数据地址,发送数据大小,等待时间
while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)!=SET);		//等待发送结束

2.3通信协议

1.在学习过程中我见到了一种非常好的通讯协议相对于某些代码而言,该代码省去了分离和整合的步骤。
具体操作步骤为:
第一步:定义union结构体。
第二步:在union中,定义需要发送大小的数组。
第三步:定义真正自己要发送的数据,为结构体。包含头,数据,尾等。
第五步:在主函数中给真正要发送的结构体赋值,串口发送时发送union的数组。

//定义在uart.h 文件中
#define DATA_LEN 16

#pragma pack(1)	//一个字节
typedef union _Upload_data_		//详细可以学一下union相关的知识,union内部数据的存取
{
  unsigned char buffer[DATA_LEN];
  struct _Real_data_
  {
    unsigned char header1;
    unsigned char header2;
    float X_speed;
    float Y_speed;
    unsigned char End_flag1;
    unsigned char End_flag2;
  }Real_data;
}Upload_Data;
#pragma pack(4)		//下面变为4字节

extern Upload_Data Send_data;

理论部分参考正点原子视频
多看别人代码,吸取其巧妙之处为己用才能成长得更快

2.4 printf发送修改

需要在USART.h文件中包含以下头文件。同时在usart.c文件中加入该段代码

#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
//加入以下代码,支持printf函数,而不需要选择use MicroLIB	  
#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 
	/* Whatever you require here. If the only file you are using is */ 
	/* standard output using printf() for debugging, no file handling */ 
	/* is required. */ 
}; 
/* FILE is typedef’ d in stdio.h. */ 
FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ 
	x = x; 
} 
//重定向fputc函数
//printf的输出,指向fputc,由fputc输出到串口
//这里使用串口1(USART1)输出printf信息
int fputc(int ch, FILE *f)
{      
	while((USART2->SR&0X40)==0);//等待上一次串口数据发送完成  
	USART2->DR = (uint8_t) ch;      	//写DR,串口1将发送数据
	return ch;
}
#endif 
//end

个人总结

  1. USART收发数据时其波特率必须对应,否则容易出现,数据不对的情况。 e.g.发0xff 收变成0x3f
  2. USART收发数据时可以将数据长度定义长一些,数据接收是按一个包一个包接收的。不是一直接收。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值