MODBUS通讯+C语言源代码 - 图文 

loading 分享 2026-8-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, 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 };

unsigned char auchCRCLo[256] = {

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 };

unsigned char uchCRCHi = 0xFF ; /* 高CRC字节初始化 */ unsigned char uchCRCLo = 0xFF ; /* 低CRC 字节初始化 */ unsigned uIndex = 0; /* CRC循环中的索引 */

while (usDataLen--) /* 传输消息缓冲区 */

{

uIndex = uchCRCHi ^ *puchMsg++ ; /* 计算CRC */ uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ; uchCRCLo = auchCRCLo[uIndex] ; }

return (unsigned short)((unsigned short)uchCRCHi << 8 | uchCRCLo) ; }

/*****************************************************************************/

/*********************************************************************************/ /*函数名称: SendRtuCmdToModBus() *输入参数: 共 个参数; *输出参数: 共 个参数; *返回值: 无

*需储存的参数: 共 个参数; *功能介绍:

(1)发送ModBus RTU 指令到 Modbus Slave,加上CRC16校验码; *修改日志:

*[2005-11-28 16:40] Ver. 1.00 开始编写; 完成; *[2006-3-1 9:02] 返回类型改为void; /* */ /*********************************************************************************/ void SendRtuCmdToModBus(int ModPort, unsigned char cmd[], unsigned short len) {

unsigned short CRC16;

CRC16=GetCRC16(cmd,len); ToComBufn(ModPort,cmd,len); ToCom(ModPort, (unsigned char)(CRC16 >> 8 & 0x00FF)); /* send CRC16 high */

ToCom(ModPort, (unsigned char)(CRC16 & 0x00FF)); /* send

CRC16 low */ }

/*****************************************************************************/

/*********************************************************************************/ /*函数名称: ReadModBusRtuSlave() *输入参数: 共 8 个参数; *输出参数: 共 5 个参数;

*返回值: 成功与否 1:成功, 2:失败; *需储存的参数: 共 0 个参数; *功能介绍:

(1)读取ModBusRtuSlave,并解码输出反馈字符串相关内容; ReadModBusRtuSlave(COMPORT1, ModAddr, ModFunction, ModByteNum,

ModData, &ModDataLen, ModTimeout=10, waitTime=30) *修改日志:

*[2005-11-28 16:40] Ver. 1.00 开始编写; 完成; *[2006-3-1 9:23]

增加了int counter = 0;

unsigned char ModBusMessage[MOD_STR_MAX_LEN]; *[2006-3-1 13:46]

增加了 strmcpy(ModData, ModBusMessage + 3, ModBusIdx - 5);

/* */ /*********************************************************************************/

int ReadModBusRtuSlave(int ModPort, unsigned char *ModAddr, unsigned char *ModFunction, unsigned char *ModByteNum,

unsigned char ModData[], unsigned char *ModDataLen, unsigned ModTimeout, unsigned waitTime) {

unsigned char data; unsigned long t; int i;

unsigned short CRC16; int ModBusIdx = 0;

int counter = 0;

unsigned char ModBusMessage[MOD_STR_MAX_LEN] = {'\\0'};

while((!(IsCom(ModPort)) && (counter < waitTime))) {

DelayMs(1); counter ++; }

StopWatchStart(MODBUS_STOP_WATCH); do {

while(IsCom(ModPort) && (ModBusIdx < MOD_STR_MAX_LEN - 1)) {

data = ReadCom(ModPort);

ModBusMessage[ModBusIdx ++]=data; StopWatchStart(MODBUS_STOP_WATCH); /* Print(\ }

StopWatchReadValue(MODBUS_STOP_WATCH, &t); }

while(t <= ModTimeout);

if (ModBusIdx == 0) return 0; ModBusMessage[ModBusIdx] = '\\0'; StopWatchStop(MODBUS_STOP_WATCH);

CRC16 = GetCRC16(ModBusMessage,ModBusIdx - 2);

/* for(i=0; i> 8 & 0x00FF) == ModBusMessage[ModBusIdx - 2] && (unsigned char)(CRC16 & 0x00FF) == ModBusMessage[ModBusIdx - 1]) {

*ModAddr = ModBusMessage[0]; *ModFunction = ModBusMessage[1]; *ModByteNum = ModBusMessage[2];

strmcpy(ModData, ModBusMessage + 3, ModBusIdx - 5); /* Print(\ \ /*test*/ /* for(i = 3; i < ModBusIdx - 2; i++) {

ModData[i - 3] = ModBusMessage[i]; }

ModData[i] = '\\0'; */

*ModDataLen = ModBusIdx - 5;

/* Print(\ return 1; }

else {

*ModDataLen = 0; return 0;

/* CRC16 error */

/* Print(\ } }

/*-------------------------------------------------------------------------------*/

/*********************************************************************************/ /*函数名称: ResponseFromModBusRtuSlave()

*输入参数: 共 8 个参数; *输出参数: 共 5 个参数;

*返回值: 成功与否 1:成功, 2:失败; *需储存的参数: 共 0 个参数; *功能介绍:

(1)写参数到ModBusRtuSlave后,ModbusRtuSlave反馈字符串; *修改日志:

*[2006-3-1 12:34] Ver. 1.00 开始编写; *[2006-3-1 12:48] 完成; *[2006-3-6 16:32]

strcpy(totalStr, ModBusMessage);

改为 strmcpy(totalStr, ModBusMessage, ModBusIdx); /* */ /*********************************************************************************/ int ResponseFromModBusRtuSlave(int ModPort, unsigned char totalStr[],


MODBUS通讯+C语言源代码 - 图文 .doc 将本文的Word文档下载到电脑
搜索更多关于: MODBUS通讯+C语言源代码 - 图文  的文档
相关推荐
相关阅读