2013-04-18 10 views
11

Ich habe Probleme, mehr als einen Charakter mit meinem Programm zu lesen, ich kann nicht herausfinden, was mit meinem Programm schief gelaufen ist , weil ich Python sehr neu bin.Python Serial: Wie kann ich mit der Lese- oder Readline-Funktion mehr als 1 Zeichen gleichzeitig lesen?

import serial 

ser = serial.Serial(
    port='COM5',\ 
    baudrate=9600,\ 
    parity=serial.PARITY_NONE,\ 
    stopbits=serial.STOPBITS_ONE,\ 
    bytesize=serial.EIGHTBITS,\ 
     timeout=0) 

print("connected to: " + ser.portstr) 
count=1 

while True: 
    for line in ser.read(): 

     print(str(count) + str(': ') + chr(line)) 
     count = count+1 

ser.close() 

hier sind die Ergebnisse i

erhalten
connected to: COM5 
1: 1 
2: 2 
3: 4 
4: 3 
5: 1 

tatsächlich wurde ich dieses erwähnt

connected to: COM5 
1:12431 
2:12431 

ungefähr so ​​wie oben erwartet, die gleichzeitig mehrere Charaktere in der Lage zu lesen ist nicht eins nach dem ein.

Antwort

3

Seriell sendet Daten 8 Bits gleichzeitig, das bedeutet 1 Byte und 1 Byte bedeutet 1 Zeichen.

Sie müssen Ihre eigene Methode implementieren, die Zeichen in einen Puffer lesen kann, bis ein Sentinel erreicht ist. Die Konvention besteht darin, eine Nachricht wie 12431\n zu senden, die eine Zeile anzeigt.

Also, was Sie tun müssen, ist ein Puffer zu implementieren, der X Anzahl der Zeichen speichert und sobald Sie das erreichen \n, führen Sie Ihre Operation auf der Linie und fahren fort, die nächste Zeile in den Puffer zu lesen.

Hinweis Sie kümmern Überlauf Puffer Fällen nehmen, dh wenn eine Leitung empfangen wird, der länger ist als der Puffer etc ...

EDIT

import serial 

ser = serial.Serial(
    port='COM5',\ 
    baudrate=9600,\ 
    parity=serial.PARITY_NONE,\ 
    stopbits=serial.STOPBITS_ONE,\ 
    bytesize=serial.EIGHTBITS,\ 
     timeout=0) 

print("connected to: " + ser.portstr) 

#this will store the line 
line = [] 

while True: 
    for c in ser.read(): 
     line.append(c) 
     if c == '\n': 
      print("Line: " + line) 
      line = [] 
      break 

ser.close() 
+0

Hallo, könnten Sie mir einige Leitfaden für die Pufferung geben? Ich bin jetzt wirklich verwirrt. – user2294001

+0

Ich habe den Code bearbeitet, werfen Sie einen Blick darauf. Erinnern Sie sich nur an eine Sache, der obige Code wird das Lesen in das 'line' Array halten, bis es ein' \ n' Zeichen sieht, also stellen Sie sicher, dass Ihr serielles Gerät ein '\ n' sendet. – 1337holiday

+0

Hallo, die Codes oben scheint nicht zu funktionieren. es sagt Char ist nicht definiert. – user2294001

21

Ich sehe ein paar Probleme.

Erstens:

ser.read() wird nur 1 Byte zu einem Zeitpunkt zurückzukehren.

Wenn Sie eine Zählung angeben

ser.read(5) 

es 5 Byte gelesen wird (weniger, wenn Timeout occurrs vor 5 Bytes ankommen.)

Wenn Sie wissen, dass Ihre Eingabe immer richtig mit EOL-Zeichen beendet wird, besserer Weg ist

ser.readline() 

zu verwenden, die Zeichen zu lesen, wird fortgesetzt, bis ein EOL empfangen wird.

Zweitens:

Auch wenn Sie bekommen ser.read() oder ser.readline() mehrere Bytes zurück, da Sie über den Rückgabewert iterieren, werden Sie es immer noch ein Byte Handhabung werden bei eine Zeit.

Sie sich von der

for line in ser.read(): 

befreien und einfach sagen:

line = ser.readline() 
+0

Hallo, wenn ich line = ser.readline() verwende, frage ich immer nach einem ganzzahligen Ausdruck (str (count) + str (':') + chr (line)) TypeError: eine ganze Zahl ist erforderlich – user2294001

+0

chr (line) erwartet ein ganzzahliges Argument. Du gibst es eine Schnur. – jwygralak67

1

Ich war einige Zeit von meinem Arduino uno (0-1023 Zahlen) reciving. von 1337holiday, jwygralak67 und einige Tipps von anderen Quellen verwenden Code:

import serial 
import time 

ser = serial.Serial(
    port='COM4',\ 
    baudrate=9600,\ 
    parity=serial.PARITY_NONE,\ 
    stopbits=serial.STOPBITS_ONE,\ 
    bytesize=serial.EIGHTBITS,\ 
     timeout=0) 

print("connected to: " + ser.portstr) 

#this will store the line 
seq = [] 
count = 1 

while True: 
    for c in ser.read(): 
     seq.append(chr(c)) #convert from ANSII 
     joined_seq = ''.join(str(v) for v in seq) #Make a string from array 

     if chr(c) == '\n': 
      print("Line " + str(count) + ': ' + joined_seq) 
      seq = [] 
      count += 1 
      break 


ser.close() 
+1

Ich denke, Ihr Kommentar #convert von ansii sollte sein #konvertieren von ascii –

+0

@NatoSaichek ja, du hast Recht, danke! – Desprit

Verwandte Themen