Serielle Schnittstelle

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
Campionissimo
User
Beiträge: 102
Registriert: Montag 28. März 2011, 07:50

Hallo zusammen,

ich glaube ich habe ein Probem mit meiner Seriellen Schnittstelle!
Ich lese die Daten so ein:

Code: Alles auswählen

self.se = serial.Serial(port=5,
                    baudrate=38400,
                    bytesize=serial.EIGHTBITS,
                    parity=serial.PARITY_NONE,
                    stopbits=serial.STOPBITS_ONE,
                    timeout=4,
                    xonxoff=False,
                    rtscts=False,
                    writeTimeout=1,
                    dsrdtr=False,
                    interCharTimeout=None)
line = self.se.readline()
#time.sleep(0.5)
self.protocol.write(line)
self.protocol.flush()
protocol ist eine DAtei.

die Liefert folgendes Ergebnis:

Code: Alles auswählen

$GPRMC,155538.000,A,4753.0505,N,01143.2820,E,40.40,200.03,230811,,,A*53

$GPVTG,200.03,T,,M,40.40,N,74.8,K,A*07

$G$GPGGA,155540.000,4753.0306,N,01143.2738,E,1,06,1.9,669.7,M,47.5,M,,0000*53

$GPGLL,4753.0306,N,01143.2738,E,155540.000,A,A*50

$GPGSA,A,3,03,18,21,29,16,06,,,,,,,2.9,1.9,2.2*32

$GPRMC,155540.000,A,4753.0306,N,01143.2738,E,37.90,197.00,230811,,,A*5C

$GPVTG,197.00,T,,M,37.90,N,70.2,K,A*0A

$GPGGA,155541.000,4753.0198,N,01143.2700,E,1,06,1.9,668.4,M,47.5,M,,0000*5E

$GPGLL,4753.0198,N,01143.2700,E,155541.000,A,A*5F

$GPGSA,A,3,03,18,21,29,16,06,,,,,,,2.9,1.9,2.2*32

$GPRMC,155541.000,A,4753.0198,N,01143.2700,E,39.10,195.17,230811,,,A*51

$GPVTG,195.17,T,,M,39.10,N,72.4,K,A*0C

$GPGGA,155542.000,4753.0092,N,01143.2660,E,1,06,1.9,667.4,M,47.5,M,,0000*5E

$GPGLL,4753.0092,N,01143.2660,E,155542.000,A,A*50

$GPGSA,A,3,03,18,21,29,16,06,,,,,,,2.9,1.9,2.2*32

$GPRMC,155542.000,A,4753.0092,N,01143.2660,E,36.64,194.38,230811,,,A*5E

$GPVTG,194.38,T,,M,36.64,N,67.9,K,A*05

$GPGGA,155543.000,4752.9991,N,01143.2626,E,1,06,1.9,666.2,M,47.5,M,,0000*58

$GPGLL,4752.9991,N,01143.2626,E,155543.000,A,A*51

$GPGSA,A,3,03,18,21,29,16,06,,,,,,,2.9,1.9,$GPGGA,155545.000,4752.9781,N,01143.2567,E,1,06,1.9,665.3,M,47.5,M,,0000*55

$GPGLL,4752.9781,N,01143.2567,E,155545.000,A,A*5E

$GPGSA,A,3,03,18,21,29,16,06,,,,,,,2.9,1.9,2.2*32

$GPRMC,155545.000,A,4752.9781,N,01143.2567,E,37.05,193.12,230811,,,A*59

$GPVTG,193.12,T,,M,37.05,N,68.6,K,A*0C

$GPGGA,155549.000,4752.9334,N,01143.2426,E,1,07,1.4,666.0,M,47.5,M,,0000*5B

$GPGLL,4752.9334,N,01143.2426,E,155549.000,A,A*5C

$GPGSA,A,3,03,18,21,29,31,16,06,,,,,,2.5,1.4,2.1*32

$GPGSV,3,1,10,21,76,094,29,16,51,301,34,06,43,285,23,18,29,139,35*78

$GPGSV,3,2,10,03,27,284,26,29,27,087,19,31,11,209,2$GPGGA,155553.000,4752.8810,N,01143.2236,E,1,07,1.4,670.0,M,47.5,M,,0000*5C

$GPGLL,4752.8810,N,01143.2236,E,155553.000,A,A*5C

$GPGSA,A,3,03,18,21,29,31,16,06,,,,,,2.5,1.4,2.1*32
Jetzt kann man sehen das manche zeilen nicht vollständig ausgeschrieben oder überschrieben werden.

Was ich weiß sind die baudrate und den usb port.
An was kann mein PRoblem liegen ?
Vielen Dank
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Hast du vielleicht noch etwas mehr Code? Hier sieht es so aus, als würdest du nur einmal `readline` aufrufen, ich würde aber vermuten, dass sich dort noch irgendwo eine Schleife befinden sollte.

Sebastian
Das Leben ist wie ein Tennisball.
Campionissimo
User
Beiträge: 102
Registriert: Montag 28. März 2011, 07:50

Ja natürlich fehlt da noch eine Schleife.Sorry

Code: Alles auswählen


while self.se.isOpen():
kommt über line

Danke für den Hinweis
BlackJack

@Campionissimo: Warum fehlte das denn? Wenn Du Quelltext zeigst bei dem ein Problem auftaucht, dann solltest Du auch *genau* den Quelltext zeigen und nicht etwas das so ähnlich aussieht. Denn da muss dann ja der Fehler nicht mehr enthalten sein.

Kannst Du ein komplettes, minimales, lauffähiges Beispiel zeigen, welches das Problem aufweist? Damit wir tatsächlich sehen welcher Code ausgeführt wird. Ob da irgendwelche Ausnahmen behandelt werden und Ähnliches.

Warum machst Du die Schleife so umständlich? Man kann über die Zeilen iterieren, in dem man über das `Serial`-Objekt iteriert. Genau wie bei Datei-Objekten. Kann es zum Beispiel sein, dass ``not se.isOpen()`` nicht gleichzeitig bedeuten muss, dass der Puffer auch komplett ausgelesen wurde? Dann müsste aber um den Quelltext den Du gezeigt hast, noch eine Schleife liegen, um die Ausgaben zu erzeugen.

Wie sieht es mit dem zeitlichen Verhalten aus? Kann es sein das eines der Timeouts überschritten wird?
Campionissimo
User
Beiträge: 102
Registriert: Montag 28. März 2011, 07:50

@ BlackJack
Hab mich doch schon entschuldigt ;)

Code: Alles auswählen

self.se = serial.Serial(port=5,
                    baudrate=38400,
                    bytesize=serial.EIGHTBITS,
                    parity=serial.PARITY_NONE,
                    stopbits=serial.STOPBITS_ONE,
                    timeout=6,
                    xonxoff=False,
                    rtscts=False,
                    writeTimeout=2,
                    dsrdtr=False,
                    interCharTimeout=None)

self.protocol = "pfad","a"
while self.se.isOpen():
    
        line = self.se.readline()
        #time.sleep(0.5)
        self.protocol.write(line)
        self.protocol.flush()
   
Das ist der Code das die Daten des Gerätes über die Serielle Schnittstelle einliest und speichert.
Minimalbeispiel bringt ja glaub ich nix, da ihr keinen GPS Receiver habt.

Wie könnte ich die Schleife anders machen ?
Das mit den Zeiten bin ich gerade am testen, aber im Stand funktioniert es nur nicht wenn ich den Receiver bewege.

Gruß und Danke
BlackJack

@Campionissimo: Das ist ganz bestimmt nicht der Quelltext mit dem eingelesen und gespeichert wird. Der da führt zu einem ``AttributeError: 'tuple' object has no attribute 'write'``. Ein Minimalbeispiel bringt uns auch ohne die Hardware etwas, denn Du kannst ja durchaus Fehler machen die nichts mit der Hardware zu tun haben. Zum Beispiel Ausnahmebehandlung die mehr ”behandelt” als sie sollte, oder falscher Umgang mit Dateien. Und wie die Schleife um diesen Code herum aussieht.

Zur Schleife: Eine ``for``-Schleife über das `Serial`-Objekt. Eben wie bei Dateien.
deets

Das Problem ist, dass serielle Kommunikation durchaus auch mal daneben gehen kann. Darum haben Protokolle uebelicherweise irgendwelche Mechanismen, um die Korrektheit einer Nachricht zu verifizieren. Checksummen, Laengenangaben und so weiter.

Was genau ist das fuer ein Geraet? Sieht nach einem GPS aus. Dann benutzt es sicherlich

http://en.wikipedia.org/wiki/NMEA_0183

Da steht ebenfalls etwas von checksums. Die solltest du schon pruefen. Bzw. fertige NMEA-Module nehmen, die gibt es ja schon.
Campionissimo
User
Beiträge: 102
Registriert: Montag 28. März 2011, 07:50

Ich hab jetzt mein Programm getestet und es funktioniert.
hier nochmal der teil wo es funktionierte:
@Black

Code: Alles auswählen

se = serial.Serial(port=5,
                    baudrate=38400,
                    bytesize=serial.EIGHTBITS,
                    parity=serial.PARITY_NONE,
                    stopbits=serial.STOPBITS_ONE,
                    timeout=4,
                    xonxoff=False,
                    rtscts=False,
                    writeTimeout=1,
                    dsrdtr=False,
                    interCharTimeout=None)

protocol=open("C:\Desktop\GPS.txt" , "w")

while se.isOpen():
        line = se.readline()
        print line
        protocol.write(line)
natürlich fehlen aber die Bibliotheken

@deets
Der GPS Receiver heisst Navilock NL-464US
Danke
Campionissimo
User
Beiträge: 102
Registriert: Montag 28. März 2011, 07:50

Wollte noch mal nachfragen, ob keiner mein Problem kennt.
deets

Was denn fuer ein Problem? Du hast doch geschrieben, jetzt geht es? Und hast du meinen Hinweis beachtet, und checksummen geprueft, bzw. Bibliotheken verwandt?
Campionissimo
User
Beiträge: 102
Registriert: Montag 28. März 2011, 07:50

Ja das das Programm funktioniert, aber nicht das der Fehler weg ist. Die Daten überschreiben sich immer noch.
Bibs passen auch. Wenn ich die Checksumme überprüfe ist der gleiche fehler nur das die Daten nicht mehr gehschrieben werden.
BlackJack

@Campionissimo: Damit wäre das Problem doch dann aber gelöst, oder?
Campionissimo
User
Beiträge: 102
Registriert: Montag 28. März 2011, 07:50

Nein, weil eben die Daten einfach gar nicht mehr angezeigt werden. ich habe leiber einen Teil, als gar nix. Am besten wäre es wenn er die zeile fertig schreibt und dann erst die neue Anfängt
BlackJack

@Campionissimo: Na dann musst Du halt die fehlerhaften Zeilen versuchen irgendwie sinnvoll zu teilen und dann halt als mehrere Zeilen in die Datei schreiben.
deets

Der Punkt ist, dass dieses Verhalten nicht aus deinem Programm selbst heraus erklaerbar ist. Es muss also an dem Geraet, der Verbindung, dem usb-adapter oder den Verbindungsparametern liegen. Kannst du mit der Geschwindigkeit spielen, oder anderen Verbindungsparametern?
Campionissimo
User
Beiträge: 102
Registriert: Montag 28. März 2011, 07:50

Ja das kann.
Das Problem ist, dass alles im Stand funktioneirt, aber nicht wenn ich unterwegs bin.
Also dauert es länger bis ich den Fehler habe.
Aber ich glaub es geht schon wollte nur wissen ob jemand den Fehler kennt.
ich sag dann aber bescheid
Campionissimo
User
Beiträge: 102
Registriert: Montag 28. März 2011, 07:50

Ich glaube, dass ich den Fehler gefunden habe.
ich habe insgesamt 5 Threads laufen d.h. heisst sie laufen quasi paralllel.
Wenn ich Daten von einem zum anderen thread schicke geht ein bischen Zeit drauf.
Der GPS Receiver muss also warten, aber empfängt trotzdem Daten. Die dann aufgrund der Zeit verloren gehen.
Wie könnte ich das lösen, dass die Daten vom GPS Receiver auf jeden Fall ankommen ?

Danke
Antworten