Ich habe folgende Protokoll-Spezifikation für Nachrichten an ein Gerät zu senden, mit denen uns der Integration in Bytes unterteilt, die durch Bestellung:Probleme mit Prüfsumme Bits auf einem benutzerdefiniertes Protokoll in Ruby Implementierung
- Binary 0x02 Startbyte
- ASCII '1' oder '2' oder '3' bzw. '4' Geräteadresse
- ASCII '0' - Keine Änderung '1' - Change Ausgang Lastausgangsänderung
- ASCII 'E' - Boost-Spannung Set ' D '- Entladespannung' T '- Temperaturkompensation' C '- Max.
- ASCII '0' - Keine Änderung '-' - Ausgewählte Wert herunterschalten '+'
- Binary s = (Byte) SUM (2; 5) CRC_H = 0b1000_s7_s6_s5_s4 Checksum Höhe Byte
- Binary s = (byte) SUM (2; 5) = CRC_L 0b1000_s3_s2_s1_s0 Checksum low byte
- Binary 0x03
ich habe Probleme bekommen Bytes 6 & 7 korrekt.
Es ist nicht sehr klar, wie man die Prüfsumme berechnet, es sagt Byte 6 und 7 sind eine Summe von (2; 5) - was bedeutet 2; 5?
der Code i haben derzeit ist:
require 'serialport'
# Open collector serial port
serial = SerialPort.new('/dev/ttyAMA0', baud: 9600, data_bits: 8, stop_bits: 1,
parity: SerialPort::NONE)
checksum = '10E0'.unpack("C*").inject(:+).ord
p serial.write(0x02.chr) # start byte
p serial.write('10E0') # commands
p serial.write(checksum + checksum) # checksum byte 1 + 2
p serial.write(0x03.chr) # End byte
p serial.read
kein Glück mit einer Antwort. Hat jemand eine Idee, was mache ich falsch? oder ein besseres Verständnis für diese Spezifikation?
Vielen Dank!
Nehmen Sie zwei Aspirin und dann einen Blick auf [Array # pack] (http://ruby-doc.org/core-2.2.0/Array.html#method-i-pack) und [String #unpack] (http://ruby-doc.org/core-2.2.0/String.html#method-i-unpack). –
Vielen Dank dafür, wie würde ich die 1101 und 0110 als ein einzelnes Byte schreiben? - Ich habe versucht, 1101.ord, aber das sagt 'chr ': 1101 außerhalb Char Bereich (RangeError) –
Sorry, ich habe einen Fehler in meinem ursprünglichen Kommentar, so dass ich es gelöscht und eine korrigierte Version unten hinzufügen. Ich bin nicht mit 'SerialPort' vertraut, also müssen Sie die Dokumente überprüfen, um zu sehen, wie man die Bytes' 0x0' und '0xD6' schreibt. –