Kommunikation via USB und RPi mit Stromzähler eHZ

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

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?

Code: Alles auswählen

#!/usr/bin/python
#
#

import sys
import serial
import time
import string

logger.info("Logik ITF : by :" + trigger['by'] )

# configure the serial connections (the parameters differs on the device you are connecting to)
ser = serial.Serial(
    port='/dev/ttyUSB2',
    baudrate=9600,
    parity=serial.PARITY_EVEN,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.SEVENBITS
)

#ser.open()
#ser.isOpen()

ser.write(b'2F3F210D0A')
#ser.write('2F3F210D0A'.enode('utf-8'))
#ser.write("/?!<0D><0A>")


# let's wait a short time before reading the responses
time.sleep(1)
out = ser.read()

logger.info(out)
	
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.
__deets__
User
Beiträge: 3111
Registriert: Mittwoch 14. Oktober 2015, 14:29

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

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

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

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

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

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

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

Samstag 1. April 2017, 14:50

@BlackJack.
Was wäre den richtig?
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: 204
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Sonntag 30. April 2017, 19:21

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