SI4463模块使用心得(无线协议)

SI4463小结

今天push project的过程中遇到了丢包现象,带有回复信标的包丢失导致主机堵塞(没来得及写Timeout),分析了下原因,记录下来明天解决。文章权当抛砖引玉,若有不对请指出。叨扰。

由于SI4463是无线模块(废话),所以必然会有使用无线网络的通病——协议问题。SI4463由于物理特性,使用完整带多跳的协议必然会导致效率的降低,并且本次项目的要求仅仅是点对点,所以选择(……自己写的)精简的无线协议为不二之选。

通过SI446X_READ_PACKET()得到的数据第一个统一为0XFF,所以可以用这个来作为简单的判别是否收到,而真正有意义的数据从第二个开始。但奇怪的是我使用店家的透明串口就没有0xff输出,虽然我猜测可能模块内部自行处理掉了0xff但实际的代码并没有,时间仓促有空继续研究———>错误,收到FF是因为一个小错误,数据第一位就是发送的第一位

另外模块即使进入RX状态也不一定能够捕捉到发过来的无线信息,在状态快速切换的情况下,能否接收到信息只是个概率问题。如每0.5s切换一次状态,则有0.5s时间内接收不到信息。所以使用包的编号(或者控制帧)来确定是否握手这个并不太现实,倒是每次通信都进行握手是很可靠的,特别是两方运算速度不对等的情况下,一方计算速度快,可能多次send,而4463的FIFO只能存很少量的数据(经过测试100byte还是差不多可以储存的),很容易就错过关键的包而无法回应,造成堵塞(这个就不得不提,SI4463空传速度433MHZ情况下用200kbps经测试可行(毕竟理论值250k),速度提高后堵塞现象减少了很多,FIFO功不可没)。

增大传输的速度可以减少数据滞留的总空中的时间,但可靠性与传输距离会下降(本次项目需要高可靠性与长距离,所以选择了最低速率)。高传输速度可以显著减少冲突与延迟问题,但对于速度不同步,计算负载不同的两方则会加重丢包的情况(理论虽然这样但经过测试SI4463的FIFO容量还算可以,一般只要切换到RX状态(TX到RX差不多20ms,但RX到TX就很快,记得1ms内就可以。文档上有提及。)就不会丢包)。

通过时钟同步可以从根本上解决问题,但对于计时器紧张的某些应用则不太实用(……如我)。计时器紧张可以选择每次都进行握手协议(如TCP),而若没有双向通信要求则直接(可以多次重复发送同一包保证一定接收)发包就可以(UDP)。


ADD:这个模块我在调试过程中发现很容易便会死机,对干扰跟电源扰动比较敏感,过段时间试试加个电容减少下波纹。SI4463具有RSSI功能,与WIFI一样可以通过这个来估计距离,不太清楚其信道评测功能,将继续研究以便实现自动跳频。

学生一个,胡言乱语一通,叨扰了。

你可能感兴趣的:(单片机,无线模块)