怎样接收不定长数据

[复制链接]
4551|13
 楼主| luckyjjjjj 发表于 2008-1-17 09:16 | 显示全部楼层 |阅读模式
没有起始和结束标志...  
dld2 发表于 2008-1-17 09:17 | 显示全部楼层

帧间有时间间隔吗?

 楼主| luckyjjjjj 发表于 2008-1-17 09:21 | 显示全部楼层

有...

接收中断里怎么定时...谢谢
dld2 发表于 2008-1-17 09:30 | 显示全部楼层

开一个定时器

定时器不需要中断,只要能读到当前计数就可以了。

在接收中断里,每进一次中断,读一下计数值。如果两次的差值大于一个阀值,就认为新的一帧开始了。

注意如果接收有FIFO,最好把接收中断的触发门限设置为一个字节。
 楼主| luckyjjjjj 发表于 2008-1-17 10:22 | 显示全部楼层

没有新帧...

一帧发完就无法进入中断了,就没差值了
dld2 发表于 2008-1-17 10:33 | 显示全部楼层

那就在中断外面察看定时器

已注册 发表于 2008-1-17 10:38 | 显示全部楼层

定时器没有中断?!

没有中断读回差值不就可能是一样的了吗?
dld2 发表于 2008-1-17 10:58 | 显示全部楼层

如果定时器溢出的时间相对比较长

就没事。可以在收到每帧第一个数据时重装一下定时器。
如果溢出时间较短,那么就加中断,对中断次数进行计数,相当于增加了定时器的位数。
zhuhai2004 发表于 2008-1-17 12:27 | 显示全部楼层

把通讯协议改掉吧,否则通讯出错的机会很大。

lelee007 发表于 2008-1-17 15:43 | 显示全部楼层

哈哈

通信协议为什么制定成这样的?
效率高?
happystar 发表于 2008-1-17 20:48 | 显示全部楼层

re 参考一下,最好每帧要加上校验

依靠超时来判断接受完一帧数据,每接受到一个数据(8bit)就判断与上个数据的时间间隔
void uart_isr() interrupt n{
.........
if(超时){ 把这个数据当成新帧的开始位;
          finish_recv = 1;//表示FIFO中有数据处理
          frame_length = n;//上帧数据的长度
    
          FIFO_deep++;//增加FIFO数据帧队列
}
else{此数据为上帧中的数据) 

}
在main中
void main(){
while(finish_recv){
     处理队列头数据帧;//根据n来选择不同的处理函数
     if(--FIFO_deep == 0)finish_recv = 0;
}
     
          
sdcw 发表于 2008-1-18 16:01 | 显示全部楼层

其实这就是一个找报文头的问题。

解决方法:
1、修改协议,使报文是一个固定长度的数据;
2、利用两个报文之间的时间间隔来找报文头。
icecut 发表于 2008-1-18 18:21 | 显示全部楼层

中断收,定时器中断超过一定次数表示结束

中断收一次,计数器清零一次
时间中断一次,计数器++
如果计数器大于N&已经接受数据=接受一帧数据。
AIRWILL 发表于 2008-1-18 19:54 | 显示全部楼层

4楼的方案可行

不过,这个超时一般为出错检测的.
因为由于中断或优先等方面的问题,一般都不能 保证数据发送上的连续,总会存在或多或少的间隔.
所以,这样总会存在些风险,还是修改下协议更妥,如果发送节点能知道数据的长度,不如将这个长度直接放在整个数据帧中,既然已经很长了,也不多这1到2个字节吧.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

59

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部