Seite 1 von 1

Auslesen UART

Verfasst: Sonntag 1. Dezember 2013, 11:26
von nccbk
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

Re: Auslesen UART

Verfasst: Sonntag 1. Dezember 2013, 11:33
von 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.

Re: Auslesen UART

Verfasst: Sonntag 1. Dezember 2013, 11:36
von nccbk
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?

Re: Auslesen UART

Verfasst: Sonntag 1. Dezember 2013, 11:45
von BlackJack
@nccbk: Da das insgesamt kein guter Code ist, würde ich es an Deiner Stelle komplett neu schreiben.

Re: Auslesen UART

Verfasst: Sonntag 1. Dezember 2013, 11:49
von nccbk
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 :-)

Re: Auslesen UART

Verfasst: Sonntag 1. Dezember 2013, 12:08
von 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.

Re: Auslesen UART

Verfasst: Sonntag 1. Dezember 2013, 12:42
von nccbk
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

Re: Auslesen UART

Verfasst: Sonntag 1. Dezember 2013, 15:26
von 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.

Re: Auslesen UART

Verfasst: Sonntag 1. Dezember 2013, 16:03
von Sirius3
Zumindest muß es »Zeichen = UART.read(1)« heißen, weil sonst mehr als ein Byte gelesen werden kann.

Re: Auslesen UART

Verfasst: Sonntag 1. Dezember 2013, 16:38
von 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.

Re: Auslesen UART

Verfasst: Sonntag 1. Dezember 2013, 16:50
von darktrym
Lass mal das open weg und setze im Konstruktor ein Timeout.

Re: Auslesen UART

Verfasst: Sonntag 1. Dezember 2013, 19:53
von nccbk
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.

Re: Auslesen UART

Verfasst: Sonntag 1. Dezember 2013, 20:07
von darktrym
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.

Re: Auslesen UART

Verfasst: Sonntag 1. Dezember 2013, 20:33
von 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?

Re: Auslesen UART

Verfasst: Sonntag 1. Dezember 2013, 21:29
von nccbk
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...