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

时间:2016-05-01 03:26:21

标签: python python-2.7 pyserial

我正在编写一个连接USB串行设备的python脚本。无论何时发送和执行命令,PIC都会返回一个#标签。 IE浏览器。 “命令执行成功。\ n#”

我希望我的python脚本在输出数据之前等待hashtag。我怎样才能做到这一点? 这就是我所拥有的。它似乎没有实际打印从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()

2 个答案:

答案 0 :(得分:0)

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

Pyserial提供了一个名为read():

的方法
  

read(size=1)

     

参数:size - 要读取的字节数。返回:读取的字节数   港口。返回类型:bytes从串行端口读取大小字节。如果   如果设置了超时,则可能会根据请求返回较少的字符。没有   超时它将阻塞,直到读取所请求的字节数。

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

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

答案 1 :(得分:0)

如果您向设备发送一些空白区域,就像它是一个终端命令一样,它会将其转换为您的"#"在里面。我已成功使用该方法。具体来说,我发送一个空格" "加上终端线结束(即" \ n"或" \ r \ n"取决于设备)。