Modbus协议

 

typedef signed char int8_t;
typedef unsigned char uint8_t;
typedef signed short int int16_t;
typedef unsigned short int uint16_t;
typedef signed long int int32_t;
typedef unsigned long int uint32_t;


uint8_t WriteRegister(uint8_t site, uint16_t address, uint16_t length, uint16_t *value) {
	uint8_t request[128], response[128];
	unsigned long BytesWritten = 0, BytesRead = 0;
	request[0] = site;
	request[1] = 0x10;
	request[2] = address >> 8;
	request[3] = address;
	request[4] = length >> 8;
	request[5] = length;
	request[6] = length * 2;
	int i = 0;
	for (i = 0; i < length; ++i) {
		request[7 + i * 2] = value[i] >> 8;
		request[8 + i * 2] = value[i];
	}

	uint16_t crc = calcCRC16(request, 7 + length * 2);
	request[7 + length * 2] = crc >> 8;
	request[8 + length * 2] = crc;
	WriteFile(RS232Handle, request, 9 + length * 2, &BytesWritten, NULL);
	Sleep(20);
	ReadFile(RS232Handle, response, 8, &BytesRead, NULL);
	if (8 != BytesRead) return 1;
	crc = calcCRC16(response, 6);
	uint16_t crcInp = response[6] << 8;
	crcInp += response[7];

	if (crc != crcInp) return 2;
	
	return 0;
}


uint8_t ReadRegister(uint8_t site, uint16_t address, uint16_t length, uint16_t *value) {
	uint8_t expectedLength = 5 + 2 * length;
	uint8_t request[8], response[128];
	request[0] = site;
	request[1] = 0x04;
	request[2] = address >> 8;
	request[3] = address;
	request[4] = length >> 8;
	request[5] = length;

	uint16_t crc = calcCRC16(request, 6);

	request[6] = crc >> 8;
	request[7] = crc;
	unsigned long BytesWritten = 0, BytesRead = 0;
	WriteFile(RS232Handle, request, 8, &BytesWritten, NULL);
	Sleep(20);
	ReadFile(RS232Handle, response, expectedLength, &BytesRead, NULL);
	if (expectedLength != BytesRead) return 1;
	crc = calcCRC16(response, expectedLength - 2);
	uint16_t crcInp = response[expectedLength - 2] << 8;
	crcInp += response[expectedLength - 1];

	if (crc != crcInp) return 2;
	
	int i = 0;
	for (i = 0; i < length; ++i) {
		value[i] = response[3 + i * 2] << 8;
		value[i] += response[4 + i * 2];
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值