1、C语言编写modbus协议C语言编写modbus协议modbus.c include main.h/字地址 0 - 255 (只取低8位)/位地址 0 - 255 (只取低8位)/* CRC 高位字节值表 */ const uint8 code 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, 0x4
2、0, 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, 0xC
3、0, 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, 0x4
4、1, 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, 0xC
5、0, 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, 0x4
6、1, 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 ;/* CRC低位字节值表*/ const uint8 code auchCRCLo = 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0
7、xC4, 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, 0
8、xF0, 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, 0
9、x25, 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, 0
10、xBB, 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, 0
11、x9E, 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 ;uint8 testCoil; /用于测试 位地址1uint16 testRegister; /用
12、于测试 字址址16uint8 localAddr = 1; /单片机控制板的地址uint8 sendCount; /发送字节个数uint8 receCount; /接收到的字节个数uint8 sendPosi; /发送位置uint16 crc16(uint8 *puchMsg, uint16 usDataLen) uint8 uchCRCHi = 0xFF ; /* 高CRC字节初始化 */ uint8 uchCRCLo = 0xFF ; /* 低CRC 字节初始化 */ uint32 uIndex ; /* CRC循环中的索引 */ while (usDataLen-) /* 传输消息缓冲区
13、 */ uIndex = uchCRCHi *puchMsg+ ; /* 计算CRC */ uchCRCHi = uchCRCLo auchCRCHiuIndex ; uchCRCLo = auchCRCLouIndex ; return (uchCRCHi 8 | uchCRCLo) ; /uint16 crc16(uint8 *puchMsg, uint16 usDataLen)/开始发送void beginSend(void) /readCount = (receBuf48) + receBuf5; /要读的个数 readCount = receBuf5; byteCount = rea
14、dCount * 2; for(i=0;i 8; sendBufi+4 = tempData & 0xff; sendBuf0 = localAddr; sendBuf1 = 3; sendBuf2 = byteCount; byteCount += 3; crcData = crc16(sendBuf,byteCount); sendBufbyteCount = crcData 8; byteCount+;sendBufbyteCount = crcData & 0xff; sendCount = byteCount + 1; beginSend();/void readRegisters(
15、void)/强制单个线圈void forceSingleCoil(void) uint8 addr; uint8 tempAddr; uint16 tempData; uint8 onOff; uint8 i; /addr = (receBuf28) + receBuf3; /tempAddr = addr & 0xfff; addr = receBuf3; tempAddr = addr; /onOff = (receBuf48) + receBuf5; onOff = receBuf4; /if(onOff = 0xff00) if(onOff = 0xff) /设为ON tempData
16、 = 1; /else if(onOff = 0x0000) else if(onOff = 0x00) /设为OFF tempData = 0; setCoilVal(tempAddr,tempData); for(i=0;ireceCount;i+) sendBufi = receBufi; sendCount = receCount; beginSend(); /void forceSingleCoil(void)/设置多个寄存器void presetMultipleRegisters(void) uint8 addr; uint8 tempAddr; uint8 byteCount;
17、uint8 setCount; uint16 crcData; uint16 tempData; uint8 finsh; /为1时完成 为0时出错 uint8 i; /addr = (receBuf28) + receBuf3; /tempAddr = addr & 0xfff; addr = receBuf3; tempAddr = addr & 0xff; /setCount = (receBuf48) + receBuf5; setCount = receBuf5; byteCount = receBuf6; for(i=0;isetCount;i+,tempAddr+) tempDa
18、ta = (receBufi*2+7 8; sendBuf3 = addr & 0xff; sendBuf4 = setCount 8; sendBuf5 = setCount & 0xff; crcData = crc16(sendBuf,6); sendBuf6 = crcData 8; sendBuf7 = crcData & 0xff; sendCount = 8; beginSend(); /void presetMultipleRegisters(void)/检查uart0数据void checkComm0Modbus(void) uint16 crcData; uint16 te
19、mpData; if(receCount 4) switch(receBuf1) case 1:/读取线圈状态(读取点 16位以内) case 3:/读取保持寄存器(一个或多个) case 5:/强制单个线圈 case 6:/设置单个寄存器 if(receCount = 8) /接收完成一组数据 /应该关闭接收中断 if(receBuf0=localAddr & checkoutError=0) crcData = crc16(receBuf,6); if(crcData = receBuf7+(receBuf6= tempData) if(receBuf0=localAddr & check
20、outError=0) crcData = crc16(receBuf,tempData-2); if(crcData = (receBuftempData-28)+ receBuftempData-1) /forceMultipleCoils(); receCount = 0; checkoutError = 0; break; case 16:/设置多个寄存器 tempData = (receBuf4= tempData) if(receBuf0=localAddr & checkoutError=0) crcData = crc16(receBuf,tempData-2); if(crc
21、Data = (receBuftempData-28)+ receBuftempData-1) presetMultipleRegisters(); receCount = 0; checkoutError = 0; break; default: break; /void checkComm0(void)/取线圈状态 返回0表示成功uint16 getCoilVal(uint16 addr,uint16 *tempData) uint16 result = 0; uint16 tempAddr; tempAddr = addr & 0xfff; /只取低8位地址 switch(tempAdd
22、r & 0xff) case 0: break; case 1: *tempData = testCoil; break; case 2: break; case 3: break; case 4: break; case 5: break; case 6: break; case 7: break; case 8:break; case 9: break; case 10: break; case 11: break; case 12: break; case 13: break; case 14: break; case 15: break; case 16: break; default
23、: break; return result;/uint16 getCoilVal(uint16 addr,uint16 *data)/设定线圈状态 返回0表示成功uint16 setCoilVal(uint16 addr,uint16 tempData) uint16 result = 0; uint16 tempAddr; tempAddr = addr & 0xfff;switch(tempAddr & 0xff) case 0: break; case 1: testCoil = tempData; break; case 2: break; case 3: break; case 4
24、: break; case 5: break; case 6: break; case 7: break; case 8: break; case 9: break; case 10: break; case 11: break; case 12: break; case 13: break; case 14: break; case 15: break;case 16: break; default: break; return result;/uint16 setCoilVal(uint16 addr,uint16 data)/取寄存器值 返回0表示成功uint16 getRegister
25、Val(uint16 addr,uint16 *tempData) uint16 result = 0; uint16 tempAddr; tempAddr = addr & 0xfff; switch(tempAddr & 0xff) case 0: break; case 1: break; case 2: break; case 3: break; case 4: break; case 5: break; case 6: break; case 7: break; case 8: break; case 9: break; case 10: break; case 11: break;
26、 case 12: break; case 13: break; case 14: break; case 15: break; case 16: *tempData = testRegister; break; default: break; return result;/uint16 getRegisterVal(uint16 addr,uint16 &data)/设置寄存器值 返回0表示成功uint16 setRegisterVal(uint16 addr,uint16 tempData) uint16 result = 0; uint16 tempAddr; tempAddr = addr & 0xfff; switch(tempAddr & 0xff) case 0: break; case 1: break; case 2: break; case 3: break; case 4: break; case 5: break; case 6: break; case 7: break; case 8: break; case 9: break; case 10: break; case 11: break; case 12: break; case 13:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1