问题描述:
GD32F407ZGT6在FreeRTOS下串口中断定长接收时,出现卡死/接收不全/接收错误的情况。(9帧数据只接收到两帧,其中第二帧的数据错误,然后程序卡死)
问题背景:
有一个传感器,可以通过外部设备对齐发送读写指令,这个传感器接收到读写指令以后会返回一个响应码。我用单片机通过ttl转RS485对齐发送指令,这个传感器能够接收到我发送的指令,并且能够返回正确的响应,用单片机读这个响应的时候出现上述问题。
已经确认硬件连接没问题,因为能够正常发送数据。中断优先级配置低于系统管理的优先级,在中断服务函数中用到了FromISR写消息队列。目前怀疑是任务调度或者系统保护什么的打断了接收数据的过程。(定长接收数据,每次接收8位有效数据,循环九次)
原因与解决:
卡死的原因是在任务中误用了FromISR以及的发送队列函数参数类型不对。接收不全的原因是我在中断服务函数中写的每接收一帧数据就要写一次队列,导致中断服务函数执行时间过长,来不及读下一帧数据。
现在改为读到数据直接存入数组,然后计数。待9帧数据都存入数组后触发if条件,执行中断服务函数中if条件中的语句,即将数组内的元素按顺序写入队列。这样,只有第九次触发接收中断时,中断服务函数执行的时间较长,但由于后边没有数据了,不妨碍数据接收。