15 中断延时

来源:互联网 发布:西南证券待遇 知乎 编辑:程序博客网 时间:2024/06/05 17:27

在epz项目中出现了一个BUG,客户反映当EPZ设备(485通信)单机测试的时候测试帧正常,但是当总线上串有其他的设备时,例如串上一台S型计数器时,则会发生通讯异常,具体测试例子如下,如果一个数据帧为 11 22 33 44 55 66 77 88 ,完整发送后应该接收epz从机发送的返回帧 11 22 ,单机通信的时候该处理完全没有问题,但是当串上一台S计数器时(该S计数器也有其固定的测试帧 例如11 44 66 77 88),通信功能瘫痪。

故障分析:从AVR单片机的收中断开始分析,收中断采用外部中断机制,即每发送一个到中断口,中断开启并且开始计时,该问题发生的原因在于,当针对于epz的数据帧 11 22 33 44 55 66 77 88 发送过来。中断口计数收到14个小字节,在中断中的计数报错处理为在固定的节点设定判断位,当当前不满足(例如固定的 内存地址、校验位,功能码等),计数清零。

define SBTYPE 0x03 //设备类型0x03 接地电阻

define SBMODEL 0x01 //设备型号0x01

define DTYPE 0x0001//数据类型

define VERNUM 0x01 //版本号

收中断函数: 其中的usart0_rx_cnt为中断计数器。

void UART0_ISR (void) interrupt 4 using 3 //这里要加一个中断延时
{
if(RI0)
{

 }   usart0_rx_buf[usart0_rx_cnt++]=SBUF0;  //选取判断-ID-功能码if(usart0_rx_cnt>13){usart0_rx_cnt=0;}if(usart0_rx_buf[0]==mod_id)         //设备地址 1byte{   //具体的数据帧判断}else    usart0_rx_cnt=0;                                         

}

那么具体的问题就是出现在,如果一个完整的数据帧(11 22 33 44 55 66 77 88),被切割成不完整的数据发送过来(11 22 33 和44 55 66 77 88),那么当接收到前3个字节后计数统计没有清零,导致下一个不能重新计数,于是程序就死在判断的 路上了。

改善方法:使用定时器,当一个数据帧传输过来的时候(11 22 33….),在每一个字节传输的间隔开启定时器,如果20ms没有收到下一个正确的字节,则此帧丢弃。定时器清零数据帧的计数。

原创粉丝点击