if (cmdArrived) //有命令到达时,读取处理该命令 { cmdArrived = 0; len = UartRead(buf, sizeof(buf)); //将接收到的命令读取到缓冲区中 if (buf[0] == 0x01) //核对地址以决定是否响应命令,本例中的本机地址为0x01 { crc = GetCRC16(buf, len-2); //计算CRC校验值 crch = crc >> 8; crcl = crc & 0xFF; if ((buf[len-2] == crch) && (buf[len-1] == crcl)) //判断CRC校验是否正确 { switch (buf[1]) //按功能码执行操作 { case 0x03: //读取一个或连续的寄存器 if ((buf[2] == 0x00) && (buf[3] <= 0x05)) //寄存器地址支持0x0000~0x0005 { if (buf[3] <= 0x04) { i = buf[3]; //提取寄存器地址 cnt = buf[5]; //提取待读取的寄存器数量 buf[2] = cnt*2; //读取数据的字节数,为寄存器数*2,因Modbus定义的寄存器为16位 len = 3; while (cnt--) { buf[len++] = 0x00; //寄存器高字节补0 buf[len++] = regGroup[i++]; //寄存器低字节 } } crc = GetCRC16(buf, len-2); //计算CRC校验值为什么是len-2? if ((buf[len-2] == crch) && (buf[len-1] == crcl)) //这句什么意思[len-2 len-1?? 为什么有的就用len 如 crc = GetCRC16(buf, len); ?[td] | [/td] |