万能的串口数据接收及处理方法

        搞单片机,肯定少不了串口的使用,不管是调试也好,与其他设备通信也好,是我们不可或缺的利器。接下来就分享一下本人在项目中使用串口接收数据及处理的方法。

        先介绍下主要思路,首先需要开一个定时器,我们接收串口端发来的数据,这个时候会产生接收中断,在中断里面我们做三件事,1.启动定时器;2.清除时间计数器;3.接收数据存放到事先定义好的缓存buffer;然后我们在定时器中断里面也做三件事:1.累加时间计数器;2.判断时间计数器是否超过我们设定的阈值(超过,说明等待了一段时间没有收到数据,判定数据接收完毕,具体时间是具体情况而定)3.判定接收完毕数据之后,清除计数器,处理接收数据的buffer,清除buffer,关闭定时器;这是主要思路,也是最为重要的部分,最后给出我的代码,可以移植到任何处理器上面,非常实用。这里在强调一下定时器的问题,我们有两种用法,一是,需要用到定时器就打开,不用就关闭,上面介绍的思路是这种使用方法;二是,打开定时器之后不关闭,让其一直运行,这样的好处是我们可以用一个定时器处理多个串口通信问题,当做一个时基,因为实际项目中很多情况都是同时会使用多个串口;下面我给的代码用的是第二种方法,了解了思路其实是很简单的事情。

串口数据结构体:

处理接口函数

串口中断处理

定时器中的数据处理,里面只是把接收到的数据原封不动传回去,使用send_str()函数,在此地方大家可以加入自己数据处理的方法

上述接口函数的具体实现

至此结束,希望对大家有所帮助,欢迎分享大家自己的想法!!!

### 32位单片机串口中断数据接收处理 对于基于ARM Cortex-M系列的32位单片机而言,利用USART(通用同步/异步收发传输器)接口可以高效地完成串行通信任务。当采用中断驱动的方式来进行数据交换时,能够显著减轻CPU负担,并提高系统的实时响应性能。 #### 中断机制概述 当中断事件发生时,比如接收到新字符或者检测到线路空闲状态,硬件会自动保存当前执行上下文并将控制权交给相应的服务例程(Interrupt Service Routine, ISR),ISR负责读取寄存器中的信息并对这些信息做出适当反应[^1]。 #### 实现方案描述 为了简化编程模型并充分利用资源,推荐的做法是在初始化阶段配置好UART模块的相关参数之后开启特定类型的中断源——例如RXNE (Receive Data register not Empty)用于指示有新的字节到达;以及可能存在的IDLE线状态变化来标记一帧完整的消息结束。一旦激活了上述任一种条件下的中断请求,则对应的回调函数会被调用来获取最新输入的数据项或是确认整个报文已被完全捕获。 下面给出一段伪代码形式的例子展示如何设置STM32微控制器上的USART外设以支持这种工作模式: ```c #include "stm32f4xx_hal.h" // 假定已经定义好了全局变量buffer[]存储接收到的信息片段 uint8_t buffer[BUFFER_SIZE]; volatile uint16_t index = 0; void UART_Init(void){ // 初始化USART实例... } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ /* 当前缓冲区已满 */ if(index >= BUFFER_SIZE - 1){ // 清除标志位并停止进一步操作直到应用程序层处理完毕现有内容 __HAL_UART_FLUSH_DRREGISTER(huart); return; } // 将刚接收到的一个字节加入缓存数组 buffer[index++] = huart->Instance->DR & 0xFF; // 如果遇到终止符则认为一次完整的消息被收集齐备 if(buffer[index-1]== '\n'){ process_message(); reset_buffer(); }else{ // 启动下一轮DMA传输继续监听更多到来的数据流 HAL_UART_Receive_IT(huart, &(buffer[index]), 1); } } ``` 此段C语言编写的程序展示了基本框架,具体细节可能会因所选用的具体型号及其配套库的不同而有所差异。值得注意的是这里假设存在一个`process_message()`函数专门用来解析已完成组装的消息体,还有另一个辅助性的`reset_buffer()`用作清理准备工作以便下次循环使用相同的内存空间。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值