SerialPorts
Здравствуйте!
Есть термометр, к нему идет описание, что он работает по простому бинарному протоколу, нужно отослать 01hex и он ответит двумя байтами температуры. По коду ниже я получаю ответ "7 8 63 63 35 40". В десятичном формате, потому что температура формируется из ответа таким образом (byte1*256 + byte2 - 1000) / 10. Проверяя термометр меняются последние два байта, подскажите пожалуйста, как правильно провести парсинг, чтобы получить правильное значение. Код:
using System; Заранее спасибо! |
Цитата:
|
Цитата:
Baud rate: 9600…115200, set by user (factory default: 115200) Data bits: 8 Parity: none Stop bits: 1 Flow control: off Protocol The protocol of the optris CT/ CTlaser/ CTvideo is a binary protocol. Checksum is needed for set commands but not for read commands. The protocol has no additional overhead with CR, LR or ACK bytes. This makes the communication fast. To get the current object temperature the user must send a simple 01hex byte and the CT/ CTlaser/ CTvideo will respond with the two byte temperature. To get the temperature as a floating value subtract 1000 and divide by 10. Checksum’s If the device is setup to use checksums any SET command must have a checksum suffix. The checksum can be switched off with command AD. After every “Power on” the device will expect the checksum again. The checksum byte is build by the arithmetical XOR of all command bytes except of the address prefix. To switch off the checksums with the SET command AD you must send the checksum. To switch on the checksums with the SET command AD you must not send the checksum. Комманды: CSlaser/ CSvideo Commands Decimal HEX Binary/ ASCII Command Data Answer Result Unit 1 0x01 binary READ Temp - Target no byte1 byte2 = (byte1 x 256 + byte2 - 1000) / 10 °C 2 0x02 binary READ Temp - Head no byte1 byte2 = (byte1 x 256 + byte2 - 1000) / 10 °C 3 0x03 binary READ current Temp - Target no byte1 byte2 = (byte1 x 256 + byte2 - 1000) / 10 °C 4 0x04 binary READ Emissivity no byte1 byte2 = (byte1 x 256 + byte2) / 1000 5 0x05 binary READ Transmission no byte1 byte2 = (byte1 x 256 + byte2) / 1000 9 0x09 binary READ Processor Temperature no byte1 = (byte1 x 256 + byte2 - 1000) / 10 14 0x0E binary READ Serial number no byte1 byte2 byte3 = byte1 x 65536 + byte2 x 256 + byte3 15 0x0F binary READ FW Rev. no byte1 byte2 = byte1 x 256 + byte2 16 0x10 binary READ Laser status no byte1 0 = off/ 1 = on 17 0x11 binary READ Emissivity switch setting no HEX value (e.g. 0x58) = Switch setting (e.g. SW1=5/ SW2=8 -> Eps. = 0,58) 129 0x81 binary SET DAC mA byte1 byte1 byte 1= mA x 10 (z.B. 4mA = 4 x 10=40) °C 130 0x82 binary RESET of DAC mA output 132 0x84 binary SET Emissivity byte1 byte2 byte1 byte2 = (byte1 x 256 + byte2) / 1000 133 0x85 binary SET Transmission byte1 byte2 byte1 byte2 = (byte1 x 256 + byte2) / 1000 144 0x90 binary SET Laser byte1 byte1 0 = off/ 1 = on Temperature calculation at CSlaser hs: (byte1 x 256 + byte2 - 10000) / 100 EXAMPLES (all bytes in HEX) Readout of object temperature Send: 01 Command for readout of object temperature Receive: 04 D3 Object temperature in tenth degree + 1000 04 D3 = dec. 1235 1235 - 1000 = 235 235 / 10 = 23,5 °C Readout of object temperature (at hs version) Send: 01 Command for readout of object temperature Receive: 30 3E Object temperature in hundredth degree + 10000 30 3E = dec. 12350 12350 - 10000 = 2350 2350 / 100 = 23.50 °C Set of emissivity Send: 84 03 B6 03B6 = dec. 950 Receive: 03 B6 950 / 1000 = 0,950 |
А зачем Вы пишете в порт \r\n ?
По доке нужно писать только \x01 Я ещё покопаю - откуда взялось 6 байт ответа То есть на текущий момент непонятно: 1) что именно ушло в порт 2) какие байты ответа надо рассматривать. Попробуйте убрать лишнюю запись, посмотрим, что ответит устройство |
Вложений: 1
Почему не прикладываете модель термометра то??
Вроде код то элементарный: На картинке тестовый пример. А ваш код получения данных будет таким: Код:
port.ReceivedBytesThreshold = 2; |
Цитата:
По сути да, нужна простая форма с текстовым окном, в котором актуальная температура. Я не очень понимаю в какую часть кода надо вставить этот отрывок |
Цитата:
Но как простой вариант - сделать кнопку. По нажатию на нее в обработчике и вставьте этот код. Разве что нужно будет компорт открыть. а потом закрыть. Если надо чтобы постоянно работало то вначале работы программы откройте порт и в какой нибуть таймере вставьте этот код. он и будет выводить данные на вашу форму. |
Вы можете,
Уберите запись "\r\n", поставьте вместо этого запись "\x01" И выложите ответ от устройства |
Цитата:
Вообщем я забил, буду мониторить на дисплейчике( Извиняюсь что не отвечал. "А зачем Вы пишете в порт \r\n ? По доке нужно писать только \x01" А что это вообще? |
Цитата:
|
13:34. |