my二月兰 发表于 2015-5-20 22:55:33

求一个好点的算法逻辑,单片机中断相关

有个MCU,串口中断不断的接收数据,按字节计数++,另外有个10ms的定时器,一直开着,也就是一直是10ms产生一次中断,现在想利用这10ms的定时器产生的中断,在这个中断中实现每20毫秒判断一次串口是处于接收数据的忙状态还是处于空闲状态,说明:串口中断是按帧接收数据的,我的意思就是想判断目前数据帧是否接收完毕,还是说处于正在接收状态。
搞了好久,测试都不准,我想请教下大家,有没有好点的算法逻辑,还是说我的逻辑是不合理的。欢迎大虾拍砖,在线等,急用,谢谢。

RAMILE 发表于 2015-5-20 23:08:47

定义一个超时计数器
uint32_tg_wTimerOutCnt;
每次串口中断后,对g_wTimerOutCnt进行清零
每次定时中断后,检测g_wTimerOutCnt是否超出上限TIMEOUT,超出则判断为帧结束,并且切换到数据接收完成状态
                              否则    并且   当前处于接收帧状态时   执行g_wTimerOutCnt +=1;

adongliu 发表于 2015-5-21 06:53:24

看看freemodbus的实现就明白了。

lingdianhao 发表于 2015-5-21 08:51:31

2楼正解,就看楼主明白了不,超时定时器的时间就是你的帧最小间隔,比如Modbus帧间隔是3.5个字符。

lovelywwei 发表于 2015-5-21 08:53:30

2楼已经说得很清楚了,还以为是什么新问题,原来就是串口接收数据什么时候结束的判断。当然,这个超时判断的timeout得根据波特率来,比如9600 bps,差不多1ms 1个字节,你可以设置为超时5ms认为帧传输结束。

jzkn 发表于 2015-5-21 09:00:40

这个需要你算一下你的波特率,还有数据帧是多长,传输间隔是多少。比如波特率9600,大概1ms一个字节。1个数据帧10个字节,大概10ms就传完了。间隔一般设定长一点,这样才好判断。如果你一个包传10ms,间隔5ms又传,处理起来就相对麻烦一点。

yuyu87 发表于 2015-5-21 09:06:53

这不就是串口超时么,玩MODBUS协议?简单啊,从收到的第一个字节数据开始,开启定时器中断,中断触发后检测收到完毕否,而不是像你现在这样一直开着定时器中断

xiaobendan 发表于 2015-5-21 09:10:31

有个特殊字节,收到这个数据,帧完成。定时的话,你的帧间隔要大于定时器。把中断搞短点,比如1MS,弄个计数器++,每次收到一个数据,计数器ZERO,当计数器大于20时,帧完成。

xiaobendan 发表于 2015-5-21 10:07:29

如三楼,建议还是看看吧

^小K^ 发表于 2015-5-28 13:21:37

有点不明白解决办法,在此受教了,

freshuman 发表于 2015-6-1 10:34:38

RAMILE 发表于 2015-5-20 23:08
定义一个超时计数器
uint32_tg_wTimerOutCnt;
每次串口中断后,对g_wTimerOutCnt进行清零


相同想法

y595906642 发表于 2015-6-1 12:04:54

在二楼基础上可以再简单一些,根据你的波特率设定好超时时间比如10ms
每次串口中断后,对超时计数器进行清零,此时正在接收状态
每次定时中断后,是接收完毕状态
页: [1]
查看完整版本: 求一个好点的算法逻辑,单片机中断相关