Python Serial:如何使用read或readline函数一次读取超过1个字符

2024-04-25 00:27:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难用我的程序读取多个字符,我似乎无法找出我的程序出了什么问题。

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

类似上述的东西,它可以同时读取多个字符,而不是一个接一个。


Tags: toimport程序portcountlineserial字符
3条回答

我用这个小方法用Python读取Arduino串行监视器

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

串行一次发送8位数据,转换为1字节,1字节表示1个字符。

您需要实现自己的方法,该方法可以将字符读入缓冲区,直到到达某个哨兵。惯例是发送一条类似12431\n的消息,指示一行。

因此,您需要做的是实现一个缓冲区,该缓冲区将存储X个字符,当您到达该缓冲区\n时,对该行执行操作并继续将下一行读取到该缓冲区中。

注意您必须处理缓冲区溢出情况,即当接收到比您的缓冲区长的行时,等等。。。

编辑

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

我看到了一些问题。

首先:

ser.read()一次只返回1个字节。

如果指定计数

ser.read(5)

它将读取5个字节(如果在5个字节到达之前发生超时,则会减少)

如果您知道您的输入总是以EOL字符正确终止, 更好的方法是

ser.readline()

它将继续读取字符,直到收到EOL。

第二:

即使让ser.read()或ser.readline()返回多个字节, 因为您正在迭代返回值,所以您将 一次只能处理一个字节。

摆脱

for line in ser.read():

然后说:

line = ser.readline()

相关问题 更多 >