Код: Выделить всё
char response[30]
short hex_sum
response[0] = 0x13
response[1] = 0xEB
hex_sum = (response[0]<<8) + response[1] //выводит 0х12EB вместо 0х13ЕВ
Модераторы: Глоб.модераторы, специалисты Weintek
Код: Выделить всё
char response[30]
short hex_sum
response[0] = 0x13
response[1] = 0xEB
hex_sum = (response[0]<<8) + response[1] //выводит 0х12EB вместо 0х13ЕВ
возможно, в WEINTEK как-то по-другому, но мне кажется тут в обоих случаях перепутаны понятия "старший" и младший", что к байтам, что к битам
работал ночью, перепутал=)возможно, в WEINTEK как-то по-другому, но мне кажется тут в обоих случаях перепутаны понятия "старший" и младший"
Вот где истина, перевел на short response и все нормализовалось. Спасибо ограмноеchar - это 8 бит, response[0]<<8 - возможно, приводит к переполнению, хотя вряд ли
еще понятно было бы, если бы затирал знаковый старший бит старшего байта
кстати, вспомнил, что он правильно сдвигает при char, проблемы начинаются именно при склеиванииа до сложения сколько получается? hex_sum = (response[0]<<8)
Поэтому данные записываю в byte(char) и пытаюсь их склеить.Формат ответа: 01 03 18 0A 09 27 9A 00 1E 00 00 FF F5 00 00 01 64 00 01 01 60 01 5A 00 5B FF 73 A3 2E
1 байт – сетевой адрес
2 байт – функция (0х03 – чтение)
3 байт – количество читаемых байтов (0х18 – 24 байта)
4:27 байты данных (HEX, пример 0А09hex = 2569dec)
28,29 – CRC16 принимаемого пакета
Код: Выделить всё
char response[30]
INPORT(response[1], "Free Protocol", 29, return_value)
и получаю эти данные01 03 00 00 00 0C 45 CF
где 0С - количество читаемых байт
45 СА - CRC
В каком виде вы хотите получить эти данные на экран? Как числовой индикатор?
Код: Выделить всё
short array[10]
GetData(array[0], "MODBUS RTU", 4x, 33, 10)