Vas*_*sta 33 python serial-port pyserial python-2.7
我使用Python中的脚本通过串行端口以2Mbps从PIC单片机收集数据.
PIC工作在2Mbps的完美时序,FTDI usb串行端口也能在2Mbps下工作(均通过示波器验证)
我发送消息(大约15个字符大小)大约每秒100-150倍,并增加数量(以检查我是否有丢失的消息等)
在我的笔记本电脑上我有Xubuntu作为虚拟机运行,我可以通过Putty和我的脚本(python 2.7和pySerial)读取串口
问题:
这是代码(我省略了大部分代码,但循环是相同的):
ser = serial.Serial('/dev/ttyUSB0', 2000000, timeout=2, xonxoff=False, rtscts=False, dsrdtr=False) #Tried with and without the last 3 parameters, and also at 1Mbps, same happens.
ser.flushInput()
ser.flushOutput()
While True:
data_raw = ser.readline()
print(data_raw)
Run Code Online (Sandbox Code Playgroud)
任何人都知道为什么pySerial需要这么多时间从串口读取直到行尾?有帮助吗?
我想实时拥有这个.
谢谢
Kob*_*i K 34
您可以使用它inWaiting()来获取输入队列中可用的字节数.
然后你可以read()用来读取字节,类似的东西:
While True:
bytesToRead = ser.inWaiting()
ser.read(bytesToRead)
Run Code Online (Sandbox Code Playgroud)
为什么不在Docs中使用readline() 这种情况:
Read a line which is terminated with end-of-line (eol) character (\n by default) or until timeout.
Run Code Online (Sandbox Code Playgroud)
你正在等待每次读数的超时,因为它等待eol.串行输入Q保持不变只需要很长时间才能到达缓冲区的"结束",为了更好地理解它:你正在写入输入Q就像赛车一样,读起来就像一辆旧车:)
可以在这里找到一个非常好的解决方案:
这是一个充当 pyserial 对象包装器的类。它允许您在没有 100% CPU 的情况下读取行。它不包含任何超时逻辑。如果发生超时,
self.s.read(i)则返回空字符串,并且您可能希望抛出异常来指示超时。
根据作者的说法,它也应该很快:
下面的代码给了我 790 kB/秒,而用 pyserial 的 readline 方法替换代码只给了我 170 kB/秒。
class ReadLine:
def __init__(self, s):
self.buf = bytearray()
self.s = s
def readline(self):
i = self.buf.find(b"\n")
if i >= 0:
r = self.buf[:i+1]
self.buf = self.buf[i+1:]
return r
while True:
i = max(1, min(2048, self.s.in_waiting))
data = self.s.read(i)
i = data.find(b"\n")
if i >= 0:
r = self.buf + data[:i+1]
self.buf[0:] = data[i+1:]
return r
else:
self.buf.extend(data)
ser = serial.Serial('COM7', 9600)
rl = ReadLine(ser)
while True:
print(rl.readline())
Run Code Online (Sandbox Code Playgroud)
小智 5
打开串口时需要将超时设置为“无”:
ser = serial.Serial(**bco_port**, timeout=None, baudrate=115000, xonxoff=False, rtscts=False, dsrdtr=False)
Run Code Online (Sandbox Code Playgroud)
这是一个阻塞命令,因此您要等到收到末尾有换行符(\n 或 \r\n)的数据: line = ser.readline()
获得数据后,它将尽快返回。