我发现很多人做无线通讯,都不在乎通讯协议的设计。或者说,通讯协议的移植性很差。
我上一家公司做过一个项目,无线通讯场合是在CNG加气站。但是同样的设备,拿到氧气瓶充装站,后台软件收到了乱码。
后来经过调查,是无线通讯协议的问题。当时一查,原来是设备没有地址编码。当时用的芯片是CC1100,如果不在程序里设置一个地址编码,任何数据都能收。而做通讯协议的那个小伙子是个还没毕业的家伙,他直接给我说,有地址编码编程很麻烦(哪里麻烦了?),所以取消掉了。
然后更奇葩的是,他的设计里居然也有应答机制。但是应答机制也很蛋疼。当时的项目是一个手持POS机向一个接收器发射数据包。那个小伙子做的是:手持机向接收器发送一包数据,然后再等待应答。这时候,如果接收器主动向手持机发送一包控制命令,那么手持机就会把这包命令给忽略掉。
但是后来就有好戏看了。当老板需要再加一台接收器的时候,他就辞职了,然后把项目交给另一个实习生。到现在,另一个实习生都没能解决这个问题。
一个好的无线通讯协议,是有很好的容错能力的,能适应复杂的通讯环境。首先信道复用是必须有的。对于数据收发来说,少收,多收,收错,都会导致致命的后果。比如你遥控一个电机转一圈,但是无线协议发了一包数据,电机接收到,转了一圈。但是电机返回的应答包,被干扰掉,然后遥控器又发一包重发,电机又转一圈……然后,就是几条人命没了。这样的事情在菜鸟身上层出不穷,甚至很多单片机老鸟(没做过无线通讯那种)。
很多没做过无线通讯的人,包括老鸟,都会把无线通讯当作有线通讯来做,那样是非常可怕的。应为无线通讯面对的环境随机因素远比有线复杂。
所以,一个很好的无线通讯协议是很有必要的,但是很多人都不重视。我一个朋友,他们基于433MHz的无线模块,距离很远。他们做测试,从成都的龙泉山到成都的三圣乡,都能点对点通讯。当然就是传一个LED闪烁指示。不过他们没有把精力用在无线协议上。我问他如果在三圣乡发一个“Hello World”,什么地方能收到,他就不敢保证了。
我用过的无线芯片,感觉最好的就是AT86RF212。主要是这款芯片的“自动化”程度非常高。硬件自动应答,硬件自动重发,硬件自动信道侦听。当然很多射频芯片都能实现这些功能,但是我见到很多做无线通讯的人,都不会去做这三项, |