web-dev-qa-db-ja.com

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

ここに私が得る結果があります

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

実際に私はこれを期待していた

connected to: COM5
1:12431
2:12431

上記のようなもので、複数の文字を1つずつではなく同時に読み取ることができます。

17
user2294001

いくつか問題があります。

最初:

ser.read()は一度に1バイトのみを返します。

カウントを指定する場合

ser.read(5)

5バイトを読み取ります(5バイトが到着する前にタイムアウトが発生した場合はそれより短くなります)。

入力が常にEOL文字で適切に終了していることがわかっている場合、より良い方法は

ser.readline()

EOLが受信されるまで、文字を読み続けます。

第二:

Ser.read()またはser.readline()で複数バイトを返す場合でも、戻り値を反復処理しているため、一度に1バイトを処理します。

取り除く

for line in ser.read():

そして言うだけ:

line = ser.readline()
27
jwygralak67

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

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

したがって、必要なことは、X個の文字を格納するバッファーを実装し、その\nに到達したらすぐにその行で操作を実行し、次の行をバッファーに読み込むことです。

Noteバッファオーバーフローの場合、つまり、バッファよりも長い行を受信した場合などに注意する必要があります。 ..

[〜#〜] 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: " + ''.join(line))
            line = []
            break

ser.close()
8
1337holiday

この小さなメソッドを使用して、PythonでArduinoシリアルモニターを読み取ります

import serial
ser = serial.Serial("COM11", 9600)
while True:
     cc=str(ser.readline())
     print(cc[2:][:-5])
7

Arduino uno(0-1023の数字)から日付を受け取っていました。 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
Desprit