[AVR单片机] AVR atmega16 串口收发,如何在接收时确定是受到第几个数?

[复制链接]
3457|6
 楼主| selfstudy 发表于 2011-7-22 18:04 | 显示全部楼层 |阅读模式
尝试了一下串口收发,接收用中断方式,发送用查询方式。由于从上位机会接收到一串数据,所以需要识别到底接收第几个数据,尝试用以下方法来试验,结果很奇怪。不理解。
方法1:1)在接收中断中置全局变量flag,收到一个数据,falg=1;2)然后在主循环while(1)中,当flag=1 ,发送接收到的数据,然后 flag=0。结果发现只能发送接收到的第1个数据。
   这样如何区分上位机发动的第几个数据呢?
方法2: 在接收中断中,若接收到数据,则就发送接收的数据,结果可以将收到的数据立即发送。

为什么呢?
joyme 发表于 2011-7-23 10:26 | 显示全部楼层
接收一串数据,很显然是时间上的冲突
你要实时传回就必须用方法2,或者你等接收完了(接收到的数据存在缓冲区里)再一次发送缓冲区里接收到的所有数据
 楼主| selfstudy 发表于 2011-7-26 18:07 | 显示全部楼层
2# joyme 谢谢!

如果是收一连串的数据,是需要预先定义好收的数据次序;存入数组或者其他;再发送,则可保证收数据不丢失??
或者其他方法?

谢谢11
joyme 发表于 2011-7-27 09:12 | 显示全部楼层
只要能保证发送时间就不会丢数据,但如果你在接收中断置标志再查询发送而不用缓冲区的话,在你发送一个字节前或中,接收中断随时会带来,那么丢数据就难免的啦。缓冲区的大小必须保证能避免新接收到的数据覆盖还没来得及发送的数据
P60914047 发表于 2011-7-27 11:00 | 显示全部楼层
你可能没有置位清零!!!如执行完一个指令后,零flag=0;这样再次发送下一个指令时,就可以重新接受了
 楼主| selfstudy 发表于 2011-7-27 11:34 | 显示全部楼层
你可能没有置位清零!!!如执行完一个指令后,零flag=0;这样再次发送下一个指令时,就可以重新接受了
P60914047 发表于 2011-7-27 11:00


在主循环中 置0了的
baobaowyd85 发表于 2011-8-8 10:54 | 显示全部楼层
方法1里面你在主函数里把标识清零。。 就是说跑到清零那块你都无法知道他进过多少个通讯中断了。。 你不能保证中断-》主函数-》中断这样的一个过程。。。 中断啊啊啊。 随时都可能来, 所以会不准。。。 即便在中断中清零也需要在用完以后马上清零。。 要不在执行过程中又来了个中断肿么办呢? 当然,也要具体看CPU中断里来同样的中断是肿么处理的。 是插入运行呢还是等这个中断结束了再走另外个中断。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

84

帖子

2

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