RS232 auf Pi permanent in Datei schreiben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
MAP
User
Beiträge: 5
Registriert: Mittwoch 26. Juni 2013, 19:46

Hallo, ich habe ein System was ständig via RS232 an einen Raspberry Pi ein HEX Frame sendet. Angeschlossen ist der PI via USB0 (sprich RS232 auf USB). Die Verbindung steht und funktioniert reibungslos.
Ich habe nun das unten stehende Python Script geschrieben. Das funktioniert soweit bis auf zwei Probleme.
1.) Ich kann nur einmal was in die Datei schreiben, führ ich das Script erneut aus, schreibt er nichts mehr in die Datei.
2.) möchte ich das Script permanent im Hintergrund ausführen um den kompletten RS232 Datenverkehr mitzuschneiden, dieses ist mir noch nicht gelungen, wer kann mir dort einen Tip geben.

[

Code: Alles auswählen

#!/usr/bin/python2.7

import serial



ser = serial.Serial('/dev/ttyUSB0',2400)



Zeichen = ser.read(9) 

fobj_in = open("ausgabe.txt")
fobj_out = open("ausgabe.txt","w")
fobj_out.write(Zeichen.encode("hex"))
fobj_in.close()
fobj_out.close()

ser.close()
ach installiert ist noch das Paket "pyserial".
vielen Dank für die Hilfe im vorraus
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Hallo und willkommen im Forum,

Warum öffnest du die Datei zwei Mal? Mit `fobj_in` machst du gar nichts, du schließt die Datei lediglich wieder. Außerdem öffnet man Dateien normalerweise mit dem with statement http://docs.python.org/2/reference/comp ... -statement. Außerdem willst du deine Datei im "Binary Mode" öffnen, also sowas:

Code: Alles auswählen

with open("ausgabe.txt","wb") as fobj_out:
    fobj_out.write(Zeichen.encode("hex"))
Wenn du den kompletten Verkehr mitprotokollieren willst, darfst du halt nicht nur neun Byte einlesen, sondern ständig ser.read() aufrufen. Das kannst du z.B mittels einer `while True:` Schleife machen.

Grüße,
anogayales
MAP
User
Beiträge: 5
Registriert: Mittwoch 26. Juni 2013, 19:46

Hallo, danke für die Antwort. Ich habe dort 9 Bytes eingegeben, da das System was mit dem PI verbunden ist ein Hex Frame sendet welches 9 byte groß ist, anschließend dann 1 sekunde pausiert und wieder ein Hex Frame sendet. Ich dachte immer wenn ich die Klammer leer lasse, empfange ich nur ein Byte.
Werde dein Lösungsansatz gleich mal testen. Wenn das funktioniert muss ich es nur noch hinbekommen das, das script permanent im Hintergrund läuft.

Danke und schönen Abend noch :)
MAP
User
Beiträge: 5
Registriert: Mittwoch 26. Juni 2013, 19:46

Guten Morgen, ich habe es hinbekommen, hier der Code:

Code: Alles auswählen

#!/usr/bin/python2.7

import serial



ser = serial.Serial('/dev/ttyUSB0',2400)
ser.close()


while 1:
	
	ser.open()
	Zeichen = ser.read(9) 


 
	with open("ausgabe.txt","ab") as fobj_out:
		fobj_out.write(Zeichen.encode("hex"))
		fobj_out.close()

		ser.close()
Vielen Dank für den Tip
BlackJack

@MAP: Warum hast Du denn statt `True` jetzt eine 1 in der ``while``-Schleife verwendet?

Der Code wird so nicht funktionieren. Man kann von geschlossenen Dateien natürlich nichts lesen.

Wenn man die ``with``-Anweisung verwendet, dann ist ein explizites `close()` nicht mehr nötig, denn das erledigt ja gerade das Blockende vom ``with``-Block.
Antworten