GD32F407ZGT6在FreeRTOS下串口中断接收异常情况及解决方法

问题描述:

GD32F407ZGT6在FreeRTOS下串口中断定长接收时,出现卡死/接收不全/接收错误的情况。(9帧数据只接收到两帧,其中第二帧的数据错误,然后程序卡死)

问题背景:

有一个传感器,可以通过外部设备对齐发送读写指令,这个传感器接收到读写指令以后会返回一个响应码。我用单片机通过ttl转RS485对齐发送指令,这个传感器能够接收到我发送的指令,并且能够返回正确的响应,用单片机读这个响应的时候出现上述问题。

已经确认硬件连接没问题,因为能够正常发送数据。中断优先级配置低于系统管理的优先级,在中断服务函数中用到了FromISR写消息队列。目前怀疑是任务调度或者系统保护什么的打断了接收数据的过程。(定长接收数据,每次接收8位有效数据,循环九次)

原因与解决:

卡死的原因是在任务中误用了FromISR以及的发送队列函数参数类型不对。接收不全的原因是我在中断服务函数中写的每接收一帧数据就要写一次队列,导致中断服务函数执行时间过长,来不及读下一帧数据。

现在改为读到数据直接存入数组,然后计数。待9帧数据都存入数组后触发if条件,执行中断服务函数中if条件中的语句,即将数组内的元素按顺序写入队列。这样,只有第九次触发接收中断时,中断服务函数执行的时间较长,但由于后边没有数据了,不妨碍数据接收。

相关推荐
不悔哥3 天前
开源OV-Watch:怎么做一个智能手表
单片机·开源·嵌入式
XiHongShi20163 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
Seoyoneh3 天前
呼叫中心系统上云还是本地部署?架构、成本与运维全维度技术对比
人工智能·信息与通信·通信
深圳老胡3 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
女神下凡3 天前
嵌入式设计的各种存储芯片的硬件/软件设计规范,非常全面。
arm开发·单片机·嵌入式硬件
梅梅9663 天前
一款mipi转lvds的lcd调试(LT8912B)
单片机·计算机外设·电脑·显示器·pd芯片
开发笔记-阿牛3 天前
蓝牙音乐灯拆解,又一次拆到蓝牙音乐灯芯片CK6865L
人工智能·单片机·嵌入式硬件·音视频·音频
一只小透明啊啊啊啊3 天前
Socket、AIDL、SOME/IP
c++·mcu
CHENKONG_CK3 天前
破解制鞋打磨痛点:RFID赋能去毛刺工序自动化升级
网络·单片机·嵌入式硬件·网络协议·tcp/ip
三佛科技-187366133973 天前
128KB~512KB Flash车规级MCU选型指南(FT32A072 / FT32A103 系列)
单片机·嵌入式硬件