我无法使用我的程序阅读多个角色,我似乎无法弄清楚我的程序出了什么问题。
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
类似上面提到的能够同时读取多个字符的东西。
答案 0 :(得分:26)
我看到了几个问题。
首先:
ser.read()一次只返回1个字节。
如果指定计数
ser.read(5)
它将读取5个字节(如果在5个字节到达之前发生超时,则会减少。)
如果您知道您的输入始终使用EOL字符正确终止, 更好的方法是使用
ser.readline()
在收到EOL之前,这将继续读取字符。
第二
即使你得到ser.read()或ser.readline()来返回多个字节, 因为你正在迭代返回值,你会 仍然是一次处理一个字节。
摆脱
for line in ser.read():
然后说:
line = ser.readline()
答案 1 :(得分:8)
串行一次发送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()
答案 2 :(得分:6)
我使用这种小方法通过Python读取Arduino串行监视器
import serial
ser = serial.Serial("COM11", 9600)
while True:
cc=str(ser.readline())
print(cc[2:][:-5])
答案 3 :(得分:1)
我从我的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()