存档在 ‘zigbee’ 分类

zigbee项目总结

2013年5月28日

在zigbee项目中,zigbee上传数据没有问题,但是如果同时有数据从PC下发到zigbee协调器时,则出现zigbee协调器串口死掉。这个问题困扰师兄和我两天时间,最后师兄发现我们的帧长是9字节,有时候串口接受到的却是12字节,导致溢出让程序跑飞,在串口代码中加入一个最大字节数判断后解决问题。

串口接收相邻字节间的时间间隔
由于采用的轮询串口接收中断标志的方式来接收存储串口数据,所以需要判断一个连续的数据流什么时候结束。经反复实验,得出一个经验数值:以9600bps为例,连续发送的字节间间隔时间小于2.8ms,即在判断一个数据是否结束时,应至少等待2.8ms看是否接收到新的一个字节,若接收到则此数据流是连续的,还没结束;若等待2.8ms仍没数据接收到,则可以判断此数据流已经结束。用C写的代码,对中断标志的查询大约循环400次≈2.8ms
串口有可能接收到假数据
当对方没有数据向2430的串口发送时,串口不能对中断标志进行无限循环的等待,必须设置一个最大等待次数,超过门限就退出循环。但是实际实验时发现往往设置了门限却退不出循环,串口轮询接收函数死在那了,这个问题困扰了好久,最后才偶然的发现即使串口悬空,对方没有任何数据发向2430的串口,但串口仍然有可能收到一些全是0x00或是全0xFF或者杂乱无章的数据。于是前面的问题有答案了:串口接收函数即使设置了最大循环等待次数,但接收函数无法退出的原因并不在此,而是接收到了连续不断的假数据!!由于一直处于接收状态,而且数据流又没断,所以串口一直在接收直到内存溢出,直到程序跑飞,也不可能超过等待次数返回。所以解决办法:写串口中断轮询接收函数必须再加上一个输入参数,即最大允许接收字节数。