Forum: Mikrocontroller und Digitale Elektronik Rasberry Pi: Fehlermeldung bei UART Signal


von Petersilikum (Gast)


Lesenswert?

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

von Kaj (Gast)


Lesenswert?

Petersilikum schrieb:
> cat /dev/ttyAMA0 >> /tmp/Text

Petersilikum schrieb:
> port = serial.Serial(
>
>         port='/dev/ttyUSB0',

von Timo N. (tnn85)


Lesenswert?

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.

von Petersilikum (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.