我目前正在构建一台使用 Arduino Mega2560 作为主控制器的机器。 Arduino 通过串口连接,获取命令,执行它并每 1ms 吐出一堆测量数据。我有一个运行 Python 的 Raspberry Pi,为用户提供一个漂亮的 GUI 来发送命令,并以可读的形式呈现数据。
我面临的问题:Arduino 能够每毫秒吐出 15 个字节的数据(因此只有 15kbyte/s),但我运行的代码只能每 10 毫秒处理大约 15 个字节,因此为 1.5kB/s 。
当我跑步时cat /dev/ttyACM0 > somefile
,我很好地看到了所有数据点。
我有以下精简的Python代码
# Reset Arduino by starting serial
microprocBusy = True
serialPort = serial.Serial("/dev/ttyACM0", baudrate=460800, timeout=0)
time.sleep(0.22);
serialPort.setDTR(False);
time.sleep(0.22);
serialPort.setDTR(True);
time.sleep(0.10);
logfile = open(logfilenamePrefix + "_" + datetime.datetime.now().isoformat() + '.txt', 'a')
# Bootloader has some timeout, we need to wait for that
serialPort.flushInput()
while(serialPort.inWaiting() == 0):
time.sleep(0.05)
# Wait for welcome message
time.sleep(0.1)
logfile.write(serialPort.readline().decode('ascii'))
logfile.flush()
# Send command
serialPort.write((command + '\n').encode('ascii'))
# Now, receive data
while(True):
incomingData = serialPort.readline().decode('ascii')
logfile.write(incomingData)
logfile.flush()
if(incomingData[:5] == "FATAL" or incomingData[:6] == "HALTED" or incomingData[:5] == "RESET"):
break;
elif(incomingData[:6] == "RESULT"):
resultData = incomingData;
logfile.flush()
当我运行这个程序时,前约 350 个数据点出现,然后我看到一些损坏的数据并错过了大约 2000 个数据点,之后我看到了另外 350 个左右的数据点。进程中CPU使用率为100%
出了什么问题? PySerial 是否优化不佳,或者我的代码中是否存在一些错误?我可以跑cat /dev/ttyACM0 > somefile
从Python,然后读取该文件,但这并不是一个很好的解决方案,不是吗?
多谢 :)
我意识到这是一个旧线程,但在撰写本文时它已被查看 3000 次,我讨厌有人在这次遭遇中关闭 pySerial。
我认为作者问题最有可能的罪魁祸首是在读取之间进行的隐式解析:
incomingData = serialPort.readline().decode('ascii')
The readline()
方法告诉 pyserial 解析到下一行。你也在做一个decode()
在您的接收周期的中间。所有这一切都发生在您的直播中。
更好的方法可能如下所示:
waiting = port.in_waiting # find num of bytes currently waiting in hardware
buffer += [chr(c) for c in port.read(waiting)] # read them, convert to ascii
# ...keep accumulating the buffer for as long as is reasonable...
processSerialData(buffer) # whatever processing needs to happen, split your
# lines, log, or whatever else *after* you get
# your data
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)