Guten Tag, ich zerbrech mir schon einige Tag den Kopf an dieser UART-Schnittstelle des RPis. PROBLEM: Ich sende Messwerte von einem AVR zum Raspberry Pi via UART, allerdings gibt mir mein Python Script nach Lust und Laune andere Fehlermeldungen aus. Die häufigste Meldung ist: ########################################################## Traceback (most recent call last): File "./code.py", line 114, in <module> wert = port.read() File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 449, in read buf = os.read(self.fd, size-len(read)) OSError: [Errno 11] Resource temporarily unavailable ########################################################## IST SITUATION: Um zu schauen ob alles in Ordnung ist habe ich auf dem AVR ein Programm geschrieben, welches lediglich einen Buchstaben, im Abstand von 500ms, via UART an den RPi senden soll. Das gesendete Signal habe ich mit dem Oszi. ausgelesen dortist alles in Ordnung. Jetzt kommt das komische an der ganzen Geschichte: Mein Python Script habe ich soweit reduziert, dass es mir lediglich den gesendeten Buchstaben ausgeben soll. ########################################################## import serial import time port = serial.Serial( port='/dev/ttyUSB0', baudrate = 9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1 ) while True: wert = port.read() print (wert) ########################################################## Das Programm hat beim ersten Versuch funktioniert allerdings nur für einige Sekunden. Beim zweiten Versuch erhielt ich eine Fehlermeldung (siehe oben). Ich führte das Programm mehrere mal direkt hinter einander aus, einge wenige male bekam ich einen oder zwei Werte ausgelesen danach leuchtete wieder besagte Fehlermeldung auf. Das Signal kommt auf jeden Fall am RPi an und kann dort auch gelesen werden, es scheint ein Fehler in meinem Script zu sein allerdings erkenne ich diesen einfach nicht. Ich habe mit cat /dev/ttyAMA0 >> /tmp/Text eine Textdatei in welche alle ankommenden Werte vom µC geschrieben werden dort kommt ALLES einwandfrei an, mit Python lässt sich allerdings nichts anzeigen. WAS ICH PROBIERT HABE UND AUSSCHLIEßEN KANN: -Ich habe das Programm als root ausgeführt -> alle Berechtigungen vorhanden -UART IST richitg frei geschaltet und ja ich habe auch /boot/cmdline.txt konfiguriert ;) -Sowohl port.read() als auch port.readline() liefern das selbe (also kein) Ergebniss -Ich habe den Port vor dem ausführen des Programms geschlossen und dort neu geöffnet -Hardwaretechnisch sind Fehler auszuschließen -...ja ich habe den RPi mal neu gestartet :P VERMUTUNG: Beim ersten Versuch habe ich in mein AVR Script kein delay zwischen den Sendezyklen des Signals geschrieben, es wurden als zig-tausend Werte übertragen. Kann es sein, dass dies zu einem Fehler geführt hat? Ist irgend ein Zwischenspeicher oder ähnliches vielleicht überlaufen und wenn ja, wie kann ich diesen leeren? Vielen Dank im Vorraus, ich hoffe ihr könnt mir helfen :) Mit freundlichsten Grüßen P.Silikum
Petersilikum schrieb: > cat /dev/ttyAMA0 >> /tmp/Text Petersilikum schrieb: > port = serial.Serial( > > port='/dev/ttyUSB0',
Petersilikum schrieb: > -UART IST richitg frei geschaltet und ja ich habe auch /boot/cmdline.txt > konfiguriert ;) Ist meines Wissens nur nötig, wenn du den Onboard-UART über die Pins am Pi nimmst. Also den ttyAMA0. Du nimmst aber anscheinend irgendeinen USB-to-Seriell-Adapter. Ist das korrekt? Petersilikum schrieb: > port='/dev/ttyUSB0', Die Ressource, die im Fehler steht ist deine UART-Schnittstelle. Diese kann nur von einem Programm gleichzeitig genutzt werden. Wenn du den Pi neustartest, ist die Ressource wieder frei. Deswegen funktioniert es auch beim ersten Mal. Du musst vor Verlassen des Skripts die Ressource wieder freigeben. Also serial.close() aufrufen, oder so.
Ahhhh da handelt es sich um einen Fehler von mir, natürlich nehm ich die Onboard UART Schnittstelle nicht die USB Schnittstelle ,:D Ich musste mir gerade den Code aus den Fingern saugen, weil ich diesen nicht vorliegen habe. Timo N. schrieb: > Du musst vor Verlassen des Skripts die Ressource wieder freigeben. > Also serial.close() aufrufen, oder so. Auch das habe ich probiert, ich habe das über das Terminal gemacht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.