使用DMA空闲中断,串口重定向和环形缓存区来实现串口通信

在使用新方法做串口通信之前,我们先回顾一下我们的老方法:串口重定向加超时解析。重定向是指用户自己重写C语言的库函数,当连接器检查到用户编写了与C语言库函数相同名字的函数时,优先采用用户编写的函数,而printf函数在C语言中我们知道是个格式化输出函数,但是在单片机中我们的输出设备是不确定的,所以我们需要重定向printf函数,因为printf在C语言标准库中实质是个宏,最终调用的其实是fputc函数,所以我们需要重写fputc函数

int fputc(int ch, FILE * str)
{
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 10);
    return ch;
}

然后是超时解析,超时解析其实是我们比较最后一次接受数据的时间和现在的时间,如果超过某个特定的值,我们就可以认为数据已经接受完毕了,那么我们就可以对接受到的信息进行处理

void uart_proc(void)
{
 //如果接收索引为0,说明没有数据需要处理,直接返回
if(uart_rx_index  0) return;
 //如果从最后一次接收到数据到现在已经超过100ms
if(uwTick - uart_rx_ticks > 100)  100ms内没有收到新的数据
{
 //清空接收缓冲区,将接收索引置零
memset(uart_rx_buffer, 0, uart_rx_index);
uart_rx_index = 0;
 //将UART接收缓冲区指针重置为接收缓冲区的起始位置
huart1.pRxBuffPtr = uart_rx_buffer;
}
}

但是这样处理就会产生一个问题,就是我如果发送或者接受的数据十分快,我们的串口中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值