2013-04-18 117 views
11

私のプログラムを使用して複数の文字を読み込むのに問題があります。私のプログラムで何が問題になったのか分かりません、私は非常にPythonの新しいです。ここ Python Serial:一度に複数の文字を読むためにread関数またはreadline関数を使用する方法

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() 

は、私は実際に私が同時にない1によって複数の文字を読むことができている前記のようなこの

connected to: COM5 
1:12431 
2:12431 

何かを期待していた

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

を取得した結果です1。

答えて

3

シリアルは8ビットずつデータを送信します。これは1バイトに変換され、1バイトは1文字を意味します。

いくつかのセンチネルに達するまで文字をバッファに読み込む独自のメソッドを実装する必要があります。大会は、1行を示す12431\nのようなメッセージを送信することです。

あなたがする必要があるのは、X個の文字を格納するバッファを実装し、それに達するとただちに\nを実行して、その行を操作して次の行をバッファに読み込みます。

あなたは

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

こんにちは、あなたは私のバッファリングにいくつかのガイドを与えることができますか?私は今、本当に混乱しています。 – user2294001

+0

コードを編集しました。一つのことを覚えておいてください。上のコードは、 '\ n'文字が見えるまでKEEPが' line'配列を読み込むので、シリアルデバイスが '\ n'を送信することを確認します。 – 1337holiday

+0

こんにちは、コードabovesは動作していないようです。 charは定義されていないと言います。 – user2294001

21

私はいくつかの問題を参照してください。

まず:

ser.read()は一度に1つのバイトを返すために起こっています。あなたは、カウント

ser.read(5) 

を指定した場合

それが5つのバイトを読み込みます(5つのバイトが到着する前にタイムアウトが発生する場合に少ない。)

を、あなたの入力が常に適切にEOL文字で終了していることがわかっている場合は、 良い方法はEOLが受信されるまで文字を読み続けるだろう

ser.readline() 

を使用することです。

第二:

あなたはser.read()またはser.readline()は戻り値を反復しているので、 を複数のバイトを返すために、あなたはまだ1バイトでそれを処理する ますを取得する場合でも、時間。

for line in ser.read(): 

を取り除くだけは言う:

line = ser.readline() 
+0

こんにちは、私はライン= ser.readline()を使用しているとき、それは常に整数の印刷(str(count)+ str( ':')+ chr(line)のために私に尋ねます TypeError:整数が必要です – user2294001

+0

chr(line)は整数の引数を期待しています。あなたはそれを文字列にしています。 – jwygralak67

1

私は私のArduino UNO(0〜1023個の数字)からいくつかの日付をrecivingました。 は、他のソースから1337holiday、jwygralak67といくつかのヒントからのコードを使用する:

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

あなたのコメント #convert from ansii は になるはずです#ascvertからascii –

+0

@NatoSaichekはい、ありがとうございます! – Desprit

関連する問題