Python的系列:如何使用read或readline的功能在同一时间阅读超过1个字符(Python

2019-08-31 10:45发布

我无法用我的程序读取多个字符,我似乎无法找出什么地方错了我的计划。

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

像上面所说的是在同一时间就不一一能够读取多个字符。

Answer 1:

我看到一对夫妇的问题。

第一:

ser.read(),只是要在同一时间返回1个字节。

如果指定了计数

ser.read(5)

它会读取5个字节(更少,如果超时occurrs 5个字节到达之前。)

如果你知道你的输入总是正确地与EOL字符终止,更好的办法是使用

ser.readline()

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

第二:

即使你ser.read()或ser.readline()返回多个字节,因为你迭代的返回值,你仍然会处理它每次一个字节。

摆脱

for line in ser.read():

而只是说:

line = ser.readline()


Answer 2:

串行的时间,即转化为1个字节和1个字节表示1个字符发送数据8位。

您需要实现自己的方法,直到达到某个定点,可以读取字符到缓冲区中。 的约定是发送这样的消息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()


Answer 3:

我用这个小方法来读取Arduino的使用Python系列显示器

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


Answer 4:

我是从我的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()


文章来源: Python Serial: How to use the read or readline function to read more than 1 character at a time