Problem: Serielle Schnittstelle auslesen

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
lemmi82
User
Beiträge: 8
Registriert: Montag 15. Januar 2007, 12:21
Wohnort: Kiel

Montag 18. Juni 2007, 09:30

Hallo zusammen,
mein Vorhaben ist einfach beschrieben, ich will mittels der seriellen Schnittstelle einen Microcontroller steuern.
Um nun zunächst die Kommunikation mit der seriellen Schnittstelle zu testen habe ich mal ein Messgerät rangehängt, das einen Seriellen Ein-/Ausgang hat. Ich will nur testen, ob das mit pyserial alles klappt. Also schreibe ich:

Code: Alles auswählen

import serial
import time		
ser = serial.Serial(port=0, timeout=2)
print ser.portstr	
ser.write ("ID?")	
print ser.read()

Code: Alles auswählen

"ID?"
soll das Gerät veranlassen seine Kennung zu senden. Aber es wird nichts ausgelesen. Das es am Gerät liegt wage ich auszuschließen. Hat jemand von euch eine Idee, woran das liegen könnte?
Ich verwende einen Linux PC mit Fedora
BlackJack

Montag 18. Juni 2007, 09:51

Falscher Port? Oder vielleicht erwartet das Gerät nach dem Befehl noch ein Zeilenendezeichen?
lemmi82
User
Beiträge: 8
Registriert: Montag 15. Januar 2007, 12:21
Wohnort: Kiel

Montag 18. Juni 2007, 10:00

Hallo, ich habe beide Ports probiert. Ohne Erfolg. Das mit dem Zeilenendezeichen könnte sein. Hast du eine Idee, was ich da senden muss? Eine andere Frage ist, ob ich unter Linux den Port noch anderswo öffnen muss? Ich habe /dev/ttyS0 und /dev/ttyS1 jeweils chmod 777 Rechte gegeben (ist das erforderlich?) noch was?
BlackJack

Montag 18. Juni 2007, 10:09

Das Zeilenende ist '\n', damit würde der Befehl also so aussehen: 'ID?\n'.

Eventuell kann auch noch ein `ser.flush()` nötig sein, damit die Daten auch wirklich rausgeschrieben werden.

Wenn sich das Programm nicht über Rechte oder Dateien die nicht geöffnet werden können beschwert, dann würde ich mir darum erst einmal keine Gedanken machen.
thelittlebug
User
Beiträge: 188
Registriert: Donnerstag 20. Juli 2006, 20:46
Wohnort: Wien
Kontaktdaten:

Montag 18. Juni 2007, 10:12

Code: Alles auswählen

zeilenende = "\n"
Ich hätte /dev/ttyS0 und 1 nicht mit chmod geändert. Klingt für mich falsch. Hätte ich noch nie gebraucht, selbst ohne Rootrechte geht bei mir nämlich,

Code: Alles auswählen

thelittlebug@ubuntu:~$ cat /dev/ttyS0
ohne Rechteproblem.

Was mir eigentlich viel mehr abgeht sind die Verbindungseinstellungen ala 19200 8N1 -> 19200 Baud, 8 DataBits, Parity None, 1 Stopbit

Wenn das nicht richtig eingestellt ist wird sich nicht viel tun ;)

lgherby[/code]
lemmi82
User
Beiträge: 8
Registriert: Montag 15. Januar 2007, 12:21
Wohnort: Kiel

Montag 18. Juni 2007, 10:25

Hallo thelittlebug und BlackJack,
danke für eure Hilfe! In Komibation mit dem Zeilenende "\n" und der richtig gewählten Baudrate/Bitzahl/Stopbits geht es jetzt.
Wenn man es weiß ist es wie immer alles ganz einfach!
Danke nochmal! Tolles Forum!
lunas
User
Beiträge: 87
Registriert: Samstag 2. Dezember 2006, 10:56

Dienstag 19. Juni 2007, 02:20

Versuch doch mal Pin 2 und Pin 3 des Steckers kurzzuschließen. An der Male-Seite klappt das ganz gut mit einem Jumper, für die Female-Seite genügt ein kurzer Draht.
Wenn Du an den richtigen Port sendest, dann solltest Du so Deine Daten wieder empfangen können (Pin2/3 sind Tx und Rx). Dann kannst Du dir sparen mit dem Protokoll eines Dir unbekannten Geräts zu experimentieren (was möglicherweise eine zusätzliche Fehlerquelle ist) und siehst, ob Dein Programm bis zur V24 Schnittstelle auch funktioniert.

lunas
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Donnerstag 21. Juni 2007, 10:15

Also so mach ich es:

Code: Alles auswählen

#!/usr/bin/python

import serial, time

ser = serial.Serial(0, 9600, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=1, xonxoff=0, rtscts=0)
#print ser.portstr
w = ser.write("!GPA\r")
time.sleep(100)
r = ser.read(10)
#i = ser.inWaiting()
print r
ser.close()
Wie schon mein Vorredner gesagt hat.. erstmal Schnittstelle einstellen
(Baudrate, Parity, Start/Stopbits usw)

Gruß
alpha
Antworten