PySerial 问题:嵌入式控制器停止回显命令

问题描述 投票:0回答:1

我正在尝试使用在 Ubuntu 主机上运行的 PySerial 来自动测试嵌入式控制器 (EC)。我可以在终端窗口(例如,PuTTY)中输入命令并全天从 EC 获取响应。然而,当我尝试使用 PySerial 程序执行相同的操作时,EC 会在一段时间后停止回显命令,就在回显命令的中间。从那时起,EC 停止响应程序,包括不发送被中断的命令的结果。

如果我终止程序并再次尝试使用终端连接 EC,EC 将无响应。如果发生导致 EC 将输出写入终端的外部事件,该信息将正确显示。问题一直存在,直到我重新启动 EC,这也会删除问题发生时 EC 上发生的所有日志。 (日志只能通过串口访问...)

PySerial 正在执行的操作似乎导致 EC 的输入处理停止。我尝试输入 Ctrl-Q (XON),希望有一些不明显的软件流控制正在进行,但这并没有什么区别。我尝试过在程序中发送交替命令,在发送命令之间发送空行,在发送命令之间插入延迟 - 但每次处理几个命令后它都会死掉。

这是我当前正在使用的脚本:

import serial
from datetime import datetime

ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=1)

print('Starting up')
# send an empty command to ensure a prompt is displayed
ser.write(b'\r\n')

commandToSend = 'battery current'
failed = 0
running = True
while running:
    while running:
        # read from the EC until a timeout occurs with no data available
        try:
            # wait for the EC prompt
            rcvData = ser.read_until(b' ec> ')
            now = datetime.now().time()
            print('{}\tRead from device: "{}"'.format(now, rcvData))
            decoded = rcvData.decode('ascii')
            if len(decoded) == 0:
                # timeout, nothing read from EC, send next command
                failed += 1
                break
            # normalize line terminations then split the data into lines
            lines = decoded.replace('\r\r\n','\r\n').split('\r\n')
            for line in lines:
                print('{}{}'.format(' '*34, line))
            break
        except KeyboardInterrupt:
            print('\nKeyboard interrupt, aborting')
            running = False
            break
        except Exception as e:
            print(e)  # this branch never executes, from my observation
            pass
    now = datetime.now().time()
    if failed > 1:
        print('{}\tCommunication with the EC has failed'.format(now))
        break
    if running:
        # send the command when there's no data to read
        print('{}\tWriting: "{}\\r\\n"'.format(now, commandToSend))
        ser.write('{}\r\n'.format(commandToSend).encode())
        ser.flush()

运行上述脚本的典型结果是这样的:

$ ./ec-uart-test.py
Starting up
20:19:10.620998     Read from device: "b'\r\n ec> '"

                                   ec>
20:19:11.622234     Read from device: "b''"
20:19:11.622345     Writing: "battery current\r\n"
20:19:11.627921     Read from device: "b'\r\n ec> '"

                                   ec>
20:19:11.628690     Read from device: "b'battery current\r\n0ma\r\r\n ec> '"
                                  battery current
                                  0ma
                                   ec>
20:19:11.628777     Writing: "battery current\r\n"
20:19:11.635899     Read from device: "b'\r\n ec> '"

                                   ec>
20:19:12.637335     Read from device: "b'battery cu'"
                                  battery cu
20:19:12.637439     Writing: "battery current\r\n"
20:19:13.644800     Read from device: "b''"

20:19:14.646080     Read from device: "b''"
20:19:14.646172     Communication with the EC has failed

除了破解 EC 并在其上放置硬件分析仪之外,我还应该尝试其他什么方法来让此代码正常工作吗?

python ubuntu embedded-linux pyserial
1个回答
0
投票

看来测试过程实际上是错误的:按照我一位同事的示例,我在终端中输入了“电池电流”命令,得到了响应,然后使用向上箭头键重新运行该命令 - 这似乎整天工作。

但是,这不是相同的测试:后面的向上箭头(从 EC 历史记录中检索最后一个命令)与重复键入命令并发送它相同。

当我尽可能快地重复将命令粘贴到终端窗口时,EC 的失败方式与使用 pySerial 发送命令的方式完全相同:失败是 EC 内部的,而不是 pySerial 在通信线路上执行的不同操作.

© www.soinside.com 2019 - 2024. All rights reserved.