pySerial 等待“#”字符从 USB 串行设备打印输出

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

我正在编写一个连接到 USB 串行设备的 python 脚本。每当发送并执行命令时,PIC 都会返回一个主题标签。 IE。 “命令执行成功。 #“

我希望我的 python 脚本在输出数据之前等待主题标签。我怎样才能做到这一点? 这就是我所拥有的。它似乎并没有实际打印从 PIC 收到的文本。任何帮助表示赞赏

if port.isOpen():    
    try:
        for x in range(0,100):
            time.sleep(0.05)
            port.write("command 1" + "\r\n")
            numLines = 0
            // wait for "#" to print output
            while True:
                response = port.readline()
                if "#" in response:
                    print(response)
                    numLines = numLines + 1
                if(numLines >= 1):
                    break

            time.sleep(0.05)
            port.write("command 2" + "\r\n")
            numLines = 0
            // wait for "#" to print output
            while True:
                response = port.readline()
                if "#" in response:
                    print(response)
                    numLines = numLines + 1
                if(numLines >= 1):
                    break

            time.sleep(0.05)
            port.write("command 3" + "\r\n")
            numLines = 0
            // wait for "#" to print output
            while True:
                response = port.readline()
                if "#" in response:
                    print(response)
                    numLines = numLines + 1
                if(numLines >= 1):
                    break

    except Exception, e1:
        print("An error occured: " + str(e1))
    port.close()
python python-2.7 pyserial
2个回答
0
投票

port.readline()
将读取串行端口,直到收到
\n
。因此,响应将包含字符串“命令已成功执行。 "。由于该字符串中没有“#”,因此代码将再次遇到
port.readline()
语句。这次它将读取“#”,但由于没有“ ",代码将卡在那里,导致无限循环。

Pyserial 提供了一个名为

read():

的方法

read(size=1)

参数: size – 要读取的字节数。返回:读取的字节数 港口。返回类型:bytes 从串口读取size字节。如果 设置超时后,它可能会根据请求返回更少的字符。没有 超时它将阻塞,直到读取请求的字节数。

read() 提供一个参数 size(默认 =1),指定要读取的字节数。因此,您可以将 PIC 发送的字符串中的字节数指定为参数。您还可以使用以下替代方案:

// wait for "#" to print output
while True:
    response += port.read()
    if "#" in response:
        print(response)
        numLines = numLines + 1
    if(numLines >= 1):
         break 

0
投票

如果您向设备发送一些空格,就好像它是终端命令一样,它会刺激它做出带有“#”的响应。我已经成功地使用了该方法。具体来说,我发送一个空格“”加上终端行结尾(即“ “ 或者 ” “取决于设备)。

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