iOS 蓝牙CRC校验 配合硬件校验

校验的方法

    unsigned short CRC16(unsigned char *puchMsg,unsigned   short usDataLen )
   {
    unsigned char uchCRCHi = 0xFF ; /* 高CRC字节初始化 */
    unsigned char uchCRCLo = 0xFF ; /* 低CRC 字节初始化 */
    unsigned uIndex ; /* CRC循环中的索引 */
    uIndex = 0x01 ^ 0x02;
    while (usDataLen--) /* 传输消息缓冲区 */
    {
        uIndex = uchCRCHi ^ (*puchMsg++); /* 计算CRC */
        //(*puchMsg)++;
        uchCRCHi = uchCRCLo ^ (auchCRCHi[uIndex]);
        uchCRCLo = auchCRCLo[uIndex];
    }
    // 左移前uchCRCHi先转换为unsigned short,否则就变成0了。
     return (uchCRCHi << 8 | uchCRCLo) ;
   // return (unsigned short)((unsigned short)uchCRCHi << 8 | uchCRCLo) ;
}  

用到的高低位字节表

const unsigned char auchCRCLo[] =
{
    0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,
    0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
    0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,
    0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
    0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,
    0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
    0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE,
    0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
    0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,
    0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
    0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,
    0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
    0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,
    0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
    0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,
    0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
    0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,
    0x40
};
//低位字节表
/* Table of CRC values for low–order byte */
const unsigned char auchCRCHi[] =
{
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
    0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
    0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
    0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
    0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
    0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
    0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
    0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
    0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
    0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
    0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
    0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,  
    0x40  
};
基本串口设置 串口设置:选择使用的串口号,可以通过“查找” 按钮自动查询当前系统可用串口。 波特率设置:输入将要使用波特率。 检验位设置:O=ODD=奇校验,E=EVEN=偶检验,N=无校验 10/16进制选择:当勾选后,接收缓冲区将以16进制数据格式显示,发送缓冲区数据必须是16进制格式,点击“发送”按钮时,将以16进制格式发送。否则(未勾选时),将以发送缓冲区将ASCII码的形式显示,点击“发送”按钮时,将以ASCII码直接发送。 打开串口:按配置打开相应串口,同时使能其他可能使用串口的按钮,再次点击则失能其他可能使用串口的按钮(如果未打开串口点击串口发送相关按钮会出现异常,另,修改串口基本设置后需要重新打开串口一次才会生效)。 帮助:即打开本文档 其他:略 简单通讯协议 界面操作说明 本协议将每帧数据数据分为帧头H,帧长L,参数P,数据D,校验C,帧尾E这6大部分,其中每个字段是否使用和使用的字节长度均可以选择或设置。帧格式设定: 帧头H字段:以16进制直接写入,软件自动计算帧头所占字节数,将存入变量H1、H2、H3……的格式中。 帧长L字段:以16进制直接写入,设置帧长所占字节,然后软件自动计算帧长,并将存入变量L1、L2、L3……的格式中。 参数P字段:以16进制直接写入,软件自动计算参数所占字节数,将存入变量P1、P2、P3……格式中。 数据D字段:这里只选择数据所占的字节数,数据的内容在后面的Dt框中填入,并将数据存入到变量Dt中。 校验C字段:这里只选择校验所占的字节数,校验的方式按后面的公式计算而来。C1、C2、C3…… 帧尾E字段:以16进制直接写入,软件自动计算帧尾所占字节数,将存入变量E1、E2、E3……格式中。 公式说明的使用方法 变量:上述字段中的H1、H2、H3……、L1、L2、L3……、P1、P2、P3……、Dt、C1、C2、C3……、E1、E2、E3……即为公式的变量名称; 立即数:操作立即数以2位16进制数,立即数中的字母必须小写。 操作符:目前只支持+(加)、-(减)、*(乘)、/(除)、&(与)、|(或)、~(非)、^(异或)、@(循环)操作,其中~(非)操作的前面变量或立即数无效; 结果变量:公式的结果存入到F1、F2、F3……变量中,同时可以供下一个公式可以使用; 结束符:整个公式以’;’号结尾,最后一次使用的结果变量将成为最终的运算结果投入到串口帧的使用; 注意: 操作符与结束符占1字节,其余均为2字节,整个公式必须有9字节并严格按照格式进行输入,否则软件无法正确识别; 变量名必须大写,16进制数必须小写,变量名只支持上述字段中的名称且序号不得超过10个,否则会出错; 中间不能插入空格; 举例:比如,在Dt字符框中输入100; 执行F1=Dt+00;F2=F1+00;表示F1=100;F2=100;最后输出F2的值100。 执行F1=Dt+10;F2=F1+20;表示F1=116;F2=148;最后输出F2的值148。 执行F1=Dt*10;F2=F1+00;表示F1=116;F2=148;最后输出F2的值148。 执行F1=Dt+00;F2=F1*0a;F1=01@F2;表示从F1开始按步进01循环发数据到F2为止,即for(i=100;i<1000;i+=1)类似的循环,发送的数据=i;循环操作目前还有待完善,不建议使用。 校验公式与此是一样的操作,但@后表示选择程序集成的特殊协议如Modbus协议。 @01表示Modbus协议,代码略 @02表示CRC-CTII协议,代码如下: U16 Crc16_B(u8 *puchMsg, u16 usDataLen){ U8 aCRCHi[256]= {0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,……,0xC1,0x81,0x40}; U8 aCRCLo[256] ={0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,……,0x81,0x80,0x40}; U8 uIndex,uchCRCHi=0xff,uchCRCLo=0xff; while(usDataLen--){ uIndex=uchCRCHi^*puchMsg++; uchCRCHi=uchCRCLo^aCRCHi[uIndex]; uchCRCLo=aCRCLo[uIndex]; } return (uchCRCHi<<8|uchCRCLo); } @03~FF保留未使用 Setting.ini配置文件 不同的使用者可能会对协议作频繁的改动,为了减少许多重复工作量,所以在左边设计了下拉菜单,选择经常使用的通讯协议配置,但即使
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值