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