✨这里只演示串口接收中断。不包含配置串口发送以及重映射printf函数。
在主程序main.c中添加全局接收字符变量以及串口中断接收数据处理部分内容。
uint8_t rx_buf;//定义中断接收变量
/*重写串口接收中断回调函数*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1) {
HAL_UART_Transmit(&huart1, &rx_buf, 1, 1000);//sizeof(rx_buf)
HAL_UART_Receive_IT(&huart1, &rx_buf, 1);//sizeof(rx_buf)
}//实现接收字符长度小于10的数据才能完整接收并转发
}
//在main函数体中添加初始化代码
/* 开启 USART 1 中断 */
HAL_UART_Receive_IT(&huart1, &rx_buf, 1);//能够进入回调函数HAL_UART_RxCpltCallback的条件之一:&rx_buf==sizeof(rx_buf)
HAL_UART_Transmit(&huart1, tx_buf, sizeof(tx_buf), 1000);
HAL_Delay(1000);
在主程序main.c中添加全局接收字符变量以及串口中断接收数据处理部分内容
#define MAX_RECV_LEN 1024 //设定可以接收的最大字节
uint8_t msg_buff[MAX_RECV_LEN] = {0}; //接收缓存区
uint8_t * msg = msg_buff; //定义一个指针指向接收缓存区
int flag = 0; //接收完成标志
int len_u4=0; //数据长度记录
/*重写串口接收中断回调函数*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/*实现串口接收不定长数据*/
uint8_t ret = HAL_OK;
msg++;
len_u4++;//数据长度计数
if( msg == msg_buff + MAX_RECV_LEN)
{
msg = msg_buff;
}
do
{
ret = HAL_UART_Receive_IT(&huart1,(uint8_t *)msg,1);
}while(ret != HAL_OK);
if(*(msg-1) == '\n') //接收以\n为结尾字符,则表示接收完成
{
flag = 1;
}
}
//在main函数体中添加初始化代码
/* 开启 USART 1 中断 */
HAL_UART_Receive_IT(&huart1, &rx_buf, 1);//能够进入回调函数HAL_UART_RxCpltCallback的条件之一:&rx_buf==sizeof(rx_buf)
HAL_UART_Transmit(&huart1, tx_buf, sizeof(tx_buf), 1000);
HAL_Delay(1000);
实现数据的不定长接收参考:
https://blog.csdn.net/weixin_30616969/article/details/99339828
链接:https://pan.baidu.com/s/1Cg1OnAM1BDUSjpQZgyracg
提取码:crgy