1 接口设计<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
1.1通信协议接口:
<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />1.1.1波特率:9600bps,数据位8,停止位1,无校验;
1.1.2数据帧:11字节,其中帧头1字节(3EH),地址码5字节(XX xx xx xx xx,XX可以设计为地区码),控制码1字节,指令1字节,CRC校验2字节,结束码1字节(0DH);
帧结构如下:
帧头 | 地址码 | 控制码 | 指令 | CRC校验 | 结束码 | |||||
3E | 00-FF | 00-FF | 00-FF | 00-FF | 00-FF | 55 | 00-FF | 00-FF | 00-FF | 0D |
帧头作为一个数据包的开始,不是以此字符开始的包无效,直接丢弃;
地址码占了5字节,共40位,理论上可以容纳2的40次方约1亿亿个被控终端;
控制码这里沿用之前的55,表示此数据包是控制包,调试中还使用66,表示回传;
指令码结合控制码,表示控制的具体内容,如闭合命令,开启命令,命令可以自定义,这里设计0X00表示开启,0XFF表示闭合;
这里CRC校验使用CRC-CCITT:(由欧洲CCITT 推荐)
G(X ) = X16 + X12 + X 5 +1 对应16进制多项式0x11021。发送端对地址码、控制码、指令码共7字节进行CRC求余项式,并将其填入CRC校验字节,打包发送;在接收端对除帧头和结束码在内的其余字节进行校验,若数据包正确,CRC校验值应为0。
考虑到MCU计算能力和资源的局限性,采用半字节校验法,使用查表法进行CRC校验,每个字节算两次(半字节算一次),可以在速度和内存空间取得均衡;
按多项式0x11021实现算得CRC余式项(半字节4位16种情况)如下:
unsigned int code crc_ta[16]={ /* CRC 余式表 */
0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
};
1.1.3接收数据帧正确性判断:帧头正确、结束码正确、5字节地址码全部正确并且CRC校验正确为正确数据包,其它为错误包,MCU主动丢弃;
1.1.4收发中心频率915MHz;
https://static.assets-stash.eet-china.com/album/old-resources/2008/9/8/c5a0e2dd-8810-4c2a-ae3c-bedeee126296.rar程序
https://static.assets-stash.eet-china.com/album/old-resources/2008/9/8/a3ac75c5-1f49-4fc0-aa90-dd9c1b0841ea.rar电路
用户461316 2008-9-9 20:34