Kommunikation via USB und RPi mit Stromzähler eHZ

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
sisamiwe
User
Beiträge: 5
Registriert: Freitag 31. März 2017, 20:15

Kommunikation via USB und RPi mit Stromzähler eHZ

Beitragvon sisamiwe » Freitag 31. März 2017, 20:49

Hallo,
ich bin neu hier uns auch Python Anfänger und damit auf Eure Hilfe angewiesen.

Zum Vorhaben. Ich möchte mit einem Python3.X Script und dem pyserial Modul 2.6 via RPi3 mit Jessie und einem USB IR-Schreib-Lesekopf meinen Stromzähler (eHZ) auslesen. Der IR-Schreib-Lesekopf ist an ttyUSB2 verbunden.

Um die Kommunikation mit dem Zähler aufzunehmen, muss als INIT folgendes senden:
HEX: 2F3F210D0A
ASCII: /?!<CR><LF>

Der Zähler antwortet mit:
ASCII: /ITF5FRP-SMV320090704<\r><\n>

Ich sende innerhalb von 2 Sekunden:
HEX: 063035300d0a
ASCII: <ACK>050<CR><LF>

Der Zähler antwortet mit seinen Daten.

Nun habe ich mich an den Code versucht, scheitere aber schon an ser.write.
Ich habe keine Ahnung, wie ich die ASCII oder HEX Zeichenfolge eingeben muss.
Könnt ihr hier helfen?

  1. #!/usr/bin/python
  2. #
  3. #
  4.  
  5. import sys
  6. import serial
  7. import time
  8. import string
  9.  
  10. logger.info("Logik ITF : by :" + trigger['by'] )
  11.  
  12. # configure the serial connections (the parameters differs on the device you are connecting to)
  13. ser = serial.Serial(
  14.     port='/dev/ttyUSB2',
  15.     baudrate=9600,
  16.     parity=serial.PARITY_EVEN,
  17.     stopbits=serial.STOPBITS_ONE,
  18.     bytesize=serial.SEVENBITS
  19. )
  20.  
  21. #ser.open()
  22. #ser.isOpen()
  23.  
  24. ser.write(b'2F3F210D0A')
  25. #ser.write('2F3F210D0A'.enode('utf-8'))
  26. #ser.write("/?!<0D><0A>")
  27.  
  28.  
  29. # let's wait a short time before reading the responses
  30. time.sleep(1)
  31. out = ser.read()
  32.  
  33. logger.info(out)
  34.    
  35. ser.close()



DANKE
Zuletzt geändert von Anonymous am Freitag 31. März 2017, 21:27, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
__deets__
User
Beiträge: 1298
Registriert: Mittwoch 14. Oktober 2015, 14:29

Re: Kommunikation via USB und RPi mit Stromzähler eHZ

Beitragvon __deets__ » Freitag 31. März 2017, 21:05

Hex kannst du zB so schreiben: b"\x48\x41\x4c\x4c\x4f"

Sprich im String einfach mit "\x" auszeichnen.
sisamiwe
User
Beiträge: 5
Registriert: Freitag 31. März 2017, 20:15

Re: Kommunikation via USB und RPi mit Stromzähler eHZ

Beitragvon sisamiwe » Freitag 31. März 2017, 21:34

Danke. Du meinst

Code: Alles auswählen

ser.write(b"/x2F/x3F/x21/x0D/x0A")

Richtig?

Ich ich das so teste, bekomme ich als Antwort

Code: Alles auswählen

>>> print(ser.read())
b'\x1f'


Irgendwas stimmt nicht.
Hast Du noch eine Idee?
BlackJack

Re: Kommunikation via USB und RPi mit Stromzähler eHZ

Beitragvon BlackJack » Freitag 31. März 2017, 21:46

@sisamiwe: / ist etwas anderes als \. Ich hoffe das war jetzt nicht zu subtil. ;-)
sisamiwe
User
Beiträge: 5
Registriert: Freitag 31. März 2017, 20:15

Re: Kommunikation via USB und RPi mit Stromzähler eHZ

Beitragvon sisamiwe » Samstag 1. April 2017, 12:33

Hallo,
danke für den Hinweis. Machmal sieht man den Wald vor lauter Bäumen nicht.

Leider geht es trotzdem nicht oder nur teilweise.
Ich schreibe mit

Code: Alles auswählen

ser.write(b"\x2F\x3F\x21\x0D\x0A")

auf die Schnittstelle und bekomme nicht die richtige Antwort.

Wenn ich eine Console (Putty) öffne und mit

Code: Alles auswählen

cat /dev/ttyUSB0

die Schnittstelle "abhöre", kommt das richtige Ergebnis.

Wie bekomme ich nun auch in Python das richtige Ergebnis?
Hast Du noch einen Tipp?
DANKE.
BlackJack

Re: Kommunikation via USB und RPi mit Stromzähler eHZ

Beitragvon BlackJack » Samstag 1. April 2017, 12:59

@sisamiwe: Was für eine Antwort bekommst Du denn? Und Du verwendest dafür auch die richtige Methode und nicht `read()` wie im Beispiel oben das solange liest und blockiert bis *alles* gelesen wurde was die andere Seite sendet bevor sie die Verbindung schliesst. Was die Gegenseite aber nicht machen wird, also hängt das ewig.
sisamiwe
User
Beiträge: 5
Registriert: Freitag 31. März 2017, 20:15

Re: Kommunikation via USB und RPi mit Stromzähler eHZ

Beitragvon sisamiwe » Samstag 1. April 2017, 13:05

Hab noch ein bisschen probiert und mit

Code: Alles auswählen

ser.read(24)

liest er auch das Richtige ein. ser.read() liest nur 1 byte und nicht alles.
DANKE
BlackJack

Re: Kommunikation via USB und RPi mit Stromzähler eHZ

Beitragvon BlackJack » Samstag 1. April 2017, 13:25

@sisamiwe: `read()` ist aber trotzdem falsch, denn da braucht sich ja nur geringfügig etwas in der Antwort ändern und schon stimmt die 24 nicht mehr und das gesamte Protokoll kommt aus dem tritt.
sisamiwe
User
Beiträge: 5
Registriert: Freitag 31. März 2017, 20:15

Re: Kommunikation via USB und RPi mit Stromzähler eHZ

Beitragvon sisamiwe » Samstag 1. April 2017, 14:50

@BlackJack.
Was wäre den richtig?
BlackJack

Re: Kommunikation via USB und RPi mit Stromzähler eHZ

Beitragvon BlackJack » Samstag 1. April 2017, 15:00

@sisamiwe: Bei einem zeilenorientierten Protokoll orientiert man sich normalerweise an den Zeilen. ;-)
Benutzeravatar
DeaD_EyE
User
Beiträge: 76
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Re: Kommunikation via USB und RPi mit Stromzähler eHZ

Beitragvon DeaD_EyE » Sonntag 30. April 2017, 19:21

Vielleicht mit ser.readline() ?
sourceserver.info - sourceserver.info/wiki/ - Support für HL2-Server

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder