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没有收到下一个正确的字节,则此帧丢弃。定时器清零数据帧的计数。
- 15 中断延时
- 嵌入式实时操作系统中断延时
- 实时操作系统中断延时尽可能小
- Linux内核中断延时与解决
- linux ------ 中断处理及延时操作
- HAL库-STM32F4 外部中断-延时
- 没用延时函数,只用中断的计算器程序
- 测试I2C中关于中断延时的问题
- STM32精确延时(非中断,非ST库函数)
- 单片机的延时与中断问题及解决方法
- stm32 软件精确延时非systick 非中断
- STM32 SysTick 精确延时(非中断方式)
- stm32 软件精确延时非systick 非中断
- 用中断的方式实现delay延时的一点注释
- 中断处理程序、中断上下文中处理延时及一些函数的调用规则
- 中断中处理延时及一些函数的调用规则(中断调i2c驱动有感)
- 中断中处理延时及一些函数的调用规则(中断调i2c驱动有感)
- 中断处理程序、中断上下文中处理延时及一些函数的调用规则
- mybatis学习之SqlMapConfig.xml的详细配置内容
- centos磁盘分区方案详解
- Java基础之ArrayList、LinkedList、Vector比较之代码示例
- TCP协议中的定时器
- PAT甲级 1008
- 15 中断延时
- Developer Network
- POJ 1488 TEX Quotes 笔记
- IP协议(网络层协议)
- 02-RabbitMQ Hello World Spring使用
- Arm汇编求数组平均值
- 16 常用芯片使用
- 基于WaveX低级音频函数的实时语音通信
- Java:重载