Auslesen UART

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
nccbk
User
Beiträge: 16
Registriert: Sonntag 10. November 2013, 15:23

Hallo zusammen,
in meinem kleinen Projekt möchte ich mithilfe von pyserial mit dem Raspberry Pi einen RFID-Modul auslesen.
Der Programmcode stammt nicht von mir sondern von einer Website.
Ich verwende python 3 und die neuste version von pyserial.

Code: Alles auswählen

import serial
import sys
import time
from operator import xor

# UART
ID = ""
Zeichen = 0

Checksumme = 0
Tag = 0 

# Flags
Startflag = "\x02"
Endflag = "\x03"

# UART oeffnen
UART = serial.Serial("/dev/ttyAMA0", 9600)
UART.open()

while True:

    # Variablen loeschen
    Checksumme = 0
    Checksumme_Tag = 0
    ID = ""
    
    # Zeichen einlesen
    Zeichen = UART.read() 

    # Uebertragungsstart signalisiert worden?
    if Zeichen == Startflag:

        # ID zusammen setzen 
        for Counter in range(13):
        
            Zeichen = UART.read() 
            ID = ID + str(Zeichen)
            
        # Endflag aus dem String loeschen
        ID = ID.replace(Endflag, "" );
        
        # Checksumme berechnen
        for I in range(0, 9, 2):
            Checksumme = Checksumme ^ (((int(ID[I], 16)) << 4) + int(ID[I+1], 16))
        Checksumme = hex(Checksumme)
        
        # Tag herausfiltern
        Tag = ((int(ID[1], 16)) << 8) + ((int(ID[2], 16)) << 4) + ((int(ID[3], 16)) << 0)
        Tag = hex(Tag)
    
        # Ausgabe der Daten
        print "------------------------------------------"
        print "Datensatz: ", ID
        print "Tag: ", Tag
        print "ID: ", ID[4:10]
        print "Checksumme: ", Checksumme
        print "------------------------------------------"
Ich habe bei mir nur die Klammern beim Ausgeben für py3 verändert.
Folgende Fehlermeldung wird ausgegeben:

Code: Alles auswählen

pi@raspberrypi ~ $ sudo su
root@raspberrypi:/home/pi# sudo python Auslesen.py
^CTraceback (most recent call last):
  File "Auslesen.py", line 29, in <module>
    Zeichen = UART.read() 
  File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 442, in read
    ready,_,_ = select.select([self.fd],[],[], self._timeout)
KeyboardInterrupt
root@raspberrypi:/home/pi# 
Hat jemand eine Idee?
Vielen Dank
BlackJack

@nccbk: Du hast offensichtlich das Programm mit der Tastenkombination Strg+C abgebrochen. Dann bekommst Du diese Ausgabe.

Einfach Klammern um die `print()`-Argumente zu setzen reicht übrigens nicht. Es gibt mehr Unterschiede zwischen Python 2 und Python 3. Speziell das literale Zeichenketten in Python 3 Unicode-Objekte sind, während sie unter Python 2 Byteketten sind.
nccbk
User
Beiträge: 16
Registriert: Sonntag 10. November 2013, 15:23

BlackJack hat geschrieben:@nccbk: Du hast offensichtlich das Programm mit der Tastenkombination Strg+C abgebrochen. Dann bekommst Du diese Ausgabe.

Einfach Klammern um die `print()`-Argumente zu setzen reicht übrigens nicht. Es gibt mehr Unterschiede zwischen Python 2 und Python 3. Speziell das literale Zeichenketten in Python 3 Unicode-Objekte sind, während sie unter Python 2 Byteketten sind.
Was muss ich denn noch ändern?
BlackJack

@nccbk: Da das insgesamt kein guter Code ist, würde ich es an Deiner Stelle komplett neu schreiben.
nccbk
User
Beiträge: 16
Registriert: Sonntag 10. November 2013, 15:23

BlackJack hat geschrieben:@nccbk: Da das insgesamt kein guter Code ist, würde ich es an Deiner Stelle komplett neu schreiben.
Nun bin ich aber kein Profi in Python...
Mir kam es daher schon recht, dass ich diesen Programmcode fast 1:1 nutzen konnte...
Mir geht es ja überhaupt erst einmal darum, das die Mühle läuft :-)
BlackJack

@nccbk: Kannst Du den Code denn überhaupt nutzen? Also funktioniert der mit Python 2.7? Du hast ihn ja aus irgendeinem Grund abgebrochen.

Ansonsten musst Du halt warten bis jemand vorbeikommt und Dir das in Python 3 programmiert, oder selber Python lernen und die Grundlagen von dem was man bei so einer etwas mehr „low level”-Programmierung benötigt.
nccbk
User
Beiträge: 16
Registriert: Sonntag 10. November 2013, 15:23

BlackJack hat geschrieben:@nccbk: Kannst Du den Code denn überhaupt nutzen? Also funktioniert der mit Python 2.7? Du hast ihn ja aus irgendeinem Grund abgebrochen.

Ansonsten musst Du halt warten bis jemand vorbeikommt und Dir das in Python 3 programmiert, oder selber Python lernen und die Grundlagen von dem was man bei so einer etwas mehr „low level”-Programmierung benötigt.
Ich verstehe schon die Grundlagen von Python und weiß auch was das Programm tut.
Problem ist eben nur, dass es gar nichts tut und anstatt mir z.B. die Id auszugeben, tut es eben gar nichts.
Deshalb habe ich es abgebrochen.

Ab diser Zeile ist wohl Schluss.

Code: Alles auswählen

# Zeichen einlesen
 Zeichen = UART.read()
Woran liegt es denn? Ist der Code falsch oder kann es auch an Hardwareproblemen liegen?
Danke
BlackJack

@nccbk: Die Zeile blockiert so lange bis ein Byte gelesen werden konnte. Wenn es wirklich daran liegt, dass da keine Bytes empfangen werden, kann das verschiedene Ursachen haben. Zum Beispiel das am anderen Ende der Verbindung keine Daten gesendet werden. Oder das Sender und Empfänger verschiedene Einstellungen verwenden und deshalb nicht ordentlich kommunizieren können.

Was auch noch sein kann, ist das Du zwar Bytes empfängst, aber da nie eines mit dem Start-Kennzeichen-Wert dabei ist.
Sirius3
User
Beiträge: 18299
Registriert: Sonntag 21. Oktober 2012, 17:20

Zumindest muß es »Zeichen = UART.read(1)« heißen, weil sonst mehr als ein Byte gelesen werden kann.
BlackJack

@Sirius3: 1 ist der Default-Wert bei `serial`:

Code: Alles auswählen

In [16]: serial.Serial.read?
Type:       instancemethod
Base Class: <type 'instancemethod'>
String Form:<unbound method Serial.read>
Namespace:  Interactive
File:       /usr/lib/python2.7/dist-packages/serial/serialposix.py
Definition: serial.Serial.read(self, size=1)
Docstring:
Read size bytes from the serial port. If a timeout is set it may
return less characters as requested. With no timeout it will block
until the requested number of bytes is read.
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Lass mal das open weg und setze im Konstruktor ein Timeout.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
nccbk
User
Beiträge: 16
Registriert: Sonntag 10. November 2013, 15:23

darktrym hat geschrieben:Lass mal das open weg und setze im Konstruktor ein Timeout.
Hat auch nichts gebracht. Fakt ist und das kann man mit print ganz gut sehen, dass er nicht über .read hinauskommt.
Deshalb scheidet die Möglichkeit, dass nicht der richtige Start-Kennzeichen-Wert empfangen wird schon einmal aus.
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Fakt ist wenn du ein Timeout setzt, kommst du auch über das read hinaus.
Nur wenn dein Gerät eben nicht antwortet ist die Antwort leer oder in deinem Fall wartet er bis in alle Ewigkeit.
Ein Rechteproblem würde sich bereits beim Konstruktor äußern.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
BlackJack

@nccbk: Wenn das nicht über das erste ``read()`` hinaus kommt, dann scheidet die Möglichkeit eben gerade *nicht* aus, denn dann wird offenbar *gar nichts* empfangen.

Sendet die Gegenseite denn etwas? Ist die Hardware richtig angeschlossen? Stimmen die Verbindungsparameter? Was sagt die Spezifikation zu der angeschlossenen Hardware dazu? Kannst Du mit einem Terminal etwas empfangen?
nccbk
User
Beiträge: 16
Registriert: Sonntag 10. November 2013, 15:23

BlackJack hat geschrieben:@nccbk: Wenn das nicht über das erste ``read()`` hinaus kommt, dann scheidet die Möglichkeit eben gerade *nicht* aus, denn dann wird offenbar *gar nichts* empfangen.

Sendet die Gegenseite denn etwas? Ist die Hardware richtig angeschlossen? Stimmen die Verbindungsparameter? Was sagt die Spezifikation zu der angeschlossenen Hardware dazu? Kannst Du mit einem Terminal etwas empfangen?
Es handelt sich, wie gesagt, um ein RFID Modul mit Antenne.
http://www.watterott.com/de/125Khz-RFID ... nger-Modul
Ich habe die Verbindugen mehrmals geprüft...
Vielleicht ein Hardwaredefekt...
Antworten