Seite 1 von 1

Serial write keine Reaktion

Verfasst: Montag 30. Januar 2017, 21:53
von Hitmare
Hallo werte Helfer und Helferinnen

Sorry vorerst falls ich das falsche Unterforum erwischt habe

Ich habe mir einen Orange Pi Zero gekauft und mit ARMbian installiert.
An den 2ten Serial Port ( ttyS1) habe ich einen Thermal Bon Drucker angeschlossen

Wenn ich jetzt per Putty/Terminal einen Text via Echo an das Gerät /dev/ttyS1 sende kommt beim Thermaldrucker der Text ausgedruckt herraus

Wenn ich aber folgendne Code ausführe tut sich nix

Code: Alles auswählen


import time
import serial

ser = serial.Serial(port='/dev/ttyS1',baudrate=9600)

try:
    ser.close()
    ser.open()
except:
    pass

ser.write("HI")
try:
ser.close()
except:
pass
Wenn ich die Python Console per hand öffne und die Werte nacheinander eingebe dann spuckt mir das system beim write immer die länge des write string aus

Code: Alles auswählen

>>> import serial
>>> ser = serial.Serial('/dev/ttyS1',9600)
>>> ser
Serial<id=0xb6b5b850, open=True>(port='/dev/ttyS1', baudrate=9600, bytesize=8, p                                                                                                     arity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)
>>> ser.close()
>>> ser.open()
>>> ser.write("HI")
2
>>> ser.close()
>>> exit()

habt ihr eine ahnung woran das liegen kann?

habs als normal user und root user ausgeführt

LG
Hitmare

Re: Serial write keine Reaktion

Verfasst: Montag 30. Januar 2017, 22:30
von snafu
Erstmal solltest du das try-except beim Schließen und Öffnen dringend loswerden. Sonst kriegst du ja gar nicht mit wenn es zu einem Problem dabei kommt. Falls du einen "harten Absturz" des Programms vermeiden möchte, dann wäre das so möglich:

Code: Alles auswählen

try:
    ser.close()
    ser.open()
except Exception as exc:
    print('Fehler:', exc)
Und das es mit der Textausgabe nicht klappt, liegt vermutlich daran, dass das Gerät eine kurze Pause benötigt. Hier hilft sowas:

Code: Alles auswählen

import time

def write(device, text, delay=0.1):
    time.sleep(delay)
    return device.write(text)

Re: Serial write keine Reaktion

Verfasst: Montag 30. Januar 2017, 23:21
von BlackJack
@Hitmare: ``try``/``except`` sollte Du am besten erst einmal ganz sein lassen. Und der erste Block mit dem Schliessen und dann gleich wieder öffnen macht so gar keinen Sinn, der kann also auch inhaltlich komplett entfallen.

Dann musst Du die Zeile auch abschliessen, denn im Terminal per ``echo`` wird da ja noch ein Zeilenende hinterher geschickt.

`Serial.write()` hat als Rückgabewert die Anzahl gesendeten Bytes, wobei als gesendet auch zum Versand gepuffert zählt.

Warum Du auch in der Python-Shell dieses schliessen nur um dann gleich wieder zu öffnen machst…

Re: Serial write keine Reaktion

Verfasst: Dienstag 31. Januar 2017, 08:59
von snafu
Jau, dann vergiss das mit dem Delay am besten wieder. Ans Line Buffering hatte ich hier gar nicht gedacht.

Re: Serial write keine Reaktion

Verfasst: Dienstag 31. Januar 2017, 09:19
von Hitmare
BlackJack hat geschrieben:@Hitmare: ``try``/``except`` sollte Du am besten erst einmal ganz sein lassen. Und der erste Block mit dem Schliessen und dann gleich wieder öffnen macht so gar keinen Sinn, der kann also auch inhaltlich komplett entfallen.

Dann musst Du die Zeile auch abschliessen, denn im Terminal per ``echo`` wird da ja noch ein Zeilenende hinterher geschickt.

`Serial.write()` hat als Rückgabewert die Anzahl gesendeten Bytes, wobei als gesendet auch zum Versand gepuffert zählt.

Warum Du auch in der Python-Shell dieses schliessen nur um dann gleich wieder zu öffnen machst…

Hallo


Danke für die Raschen antworten

Das mit dem Echo ist einleuchtend das ein zeilenende mitgesendet wird welcher den bondrucker überhaupt zum drucken beginnen lässt.

Wie kann ich mittels write() ein zeilenende mitsenden? bei echo wäre es ja

Code: Alles auswählen

echo -e "Text \\n" 
und den try hatte ich drinnen bzw das close() und open() weil warum auch immer der port bereits offen war

werde es zu einer >> if isOPen() << überprüfung umändern


Danke und LG
Hitmare

Re: Serial write keine Reaktion

Verfasst: Dienstag 31. Januar 2017, 09:24
von BlackJack
@Hitmare: Eine `isOpen()`-Prüfung macht ebensowenig Sinn. Der Port *ist offen*. Den braucht man weder prüfen noch schliessen und wieder öffnen. Und der Grund das er offen ist, ist das man ein `Serial`-Objekt mit den Parametern erstellt hat die zum öffnen notwendig sind. Das ist dokumentiert das man dann ein *offenes* `Serial`-Objekt bekommt.