打印

怎样接收不定长数据

[复制链接]
3352|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,最好把接收中断的触发门限设置为一个字节。

使用特权

评论回复
5
luckyjjjjj|  楼主 | 2008-1-17 10:22 | 只看该作者

没有新帧...

一帧发完就无法进入中断了,就没差值了

使用特权

评论回复
6
dld2| | 2008-1-17 10:33 | 只看该作者

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

使用特权

评论回复
7
已注册| | 2008-1-17 10:38 | 只看该作者

定时器没有中断?!

没有中断读回差值不就可能是一样的了吗?

使用特权

评论回复
8
dld2| | 2008-1-17 10:58 | 只看该作者

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

就没事。可以在收到每帧第一个数据时重装一下定时器。
如果溢出时间较短,那么就加中断,对中断次数进行计数,相当于增加了定时器的位数。

使用特权

评论回复
9
zhuhai2004| | 2008-1-17 12:27 | 只看该作者

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

使用特权

评论回复
10
lelee007| | 2008-1-17 15:43 | 只看该作者

哈哈

通信协议为什么制定成这样的?
效率高?

使用特权

评论回复
11
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;
}
     
          

使用特权

评论回复
12
sdcw| | 2008-1-18 16:01 | 只看该作者

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

解决方法:
1、修改协议,使报文是一个固定长度的数据;
2、利用两个报文之间的时间间隔来找报文头。

使用特权

评论回复
13
icecut| | 2008-1-18 18:21 | 只看该作者

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

中断收一次,计数器清零一次
时间中断一次,计数器++
如果计数器大于N&已经接受数据=接受一帧数据。

使用特权

评论回复
14
AIRWILL| | 2008-1-18 19:54 | 只看该作者

4楼的方案可行

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

59

帖子

0

粉丝