文章目录[隐藏]
一、串口实现printf
1.hal配置
2.重定向代码
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,5,0xffff);//20220113
//串口重定向,执行任意长度字符发送到串口
// HAL_UART_Transmit_IT(&huart1,(uint8_t*)&ch,1);
// HAL_Delay(1);
return 0;
}
int fgetc(FILE *f)
{
uint8_t ch;
//HAL_UART_Receive_IT(&huart1,(uint8_t*)&ch,1);//20220113
HAL_UART_Receive(&huart1,(uint8_t*)&ch,1,5,0xffff);//20220113
return ch;
}
二、串口2中断收发
配置同上
1.l轮循环方式发送
uint8_t uart3_txbuf[] = "UART3 Test\r\n";
HAL_UART_Transmit(&huart3, uart3_txbuf,sizeof(uart3_txbuf),100);
2.中断接收
初始化后先执行一次
HAL_UART_Receive_IT(&huart3, uart3_rxbuf, 1);
相关变量
#define MAX_RECV_LENGTH 100 //定义接收缓冲区大小
uint8_t uart2_rxbuf[MAX_RECV_LENGTH];
uint16_t uart2_cnt = 0;
uint8_t uart3_rxbuf[MAX_RECV_LENGTH];
uint16_t uart3_cnt = 0;
添加回调函数
//接收到1字节数据,回调函数如下
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART2)
{
if(uart2_cnt<MAX_RECV_LENGTH){
uart2_cnt++;
HAL_UART_Receive_IT(&huart2,uart2_rxbuf+uart2_cnt,1);
}
}
else if(huart->Instance==USART3)
{
if(uart3_cnt<MAX_RECV_LENGTH){
uart3_cnt++;
HAL_UART_Receive_IT(&huart3,uart3_rxbuf+uart3_cnt,1);
}
}
// printf("resive data \r\n");
}
可通过超时判断一帧数据是否接收完成,完成后清空缓存 重启接
不能用HAL_UART_Receive_IT 重置 不生效遇到过坑。
memset(uart3_rxbuf, 0, sizeof(uart3_rxbuf));
uart3_cnt = 0;
UART_Start_Receive_IT(&huart3,uart3_rxbuf+uart3_cnt,1); //不是HAL_UART_Receive_IT
版权声明:本文为CSDN博主「喝不惯水的鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_15174437/article/details/122746997
暂无评论