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
个人总结
- USART收发数据时其波特率必须对应,否则容易出现,数据不对的情况。 e.g.发0xff 收变成0x3f
- USART收发数据时可以将数据长度定义长一些,数据接收是按一个包一个包接收的。不是一直接收。