使用pyserial:打印结果

Working with pyserial: printing result

我对以下代码有以下疑虑:

  1. 我怎样才能打印出接收到的结果,比如如果我输入 status1,它应该 return close1/open1?我正在使用的 USB 控制器连接了锁,有一组命令可以通过 ASCII.Such 进行通信,就像我发送命令 status1 一样,它应该返回 open1/close1。

  2. 在条件行 if (ser.isOpen() == False): 中,它并不完全检查端口是否打开,因为即使没有连接任何东西,它也会绕过该行并尝试发送一个命令,这显然 return错误

下面是代码(我使用的是python 3,但有些代码是基于python 2):

import serial

#Using  pyserial Library to establish connection
#Global Variables
ser = 0

#Initialize Serial Port
def serial_connection():
    COMPORT = 3
    global ser
    ser = serial.Serial()
    ser.baudrate = 38400 #Suggested rate in Southco documentation, both locks and program must be at same rate
    ser.port = COMPORT - 1 #counter for port name starts at 0




    #check to see if port is open or closed
    if (ser.isOpen() == False):
        print ('The Port %d is Open '%COMPORT + ser.portstr)
          #timeout in seconds
        ser.timeout = 10
        ser.open()

    else:
        print ('The Port %d is closed ' %COMPORT)


#call the serial_connection() function
serial_connection()
ser.write(b'close2\r\n')

在此先感谢您的任何澄清,敬请指教。

on 1) 你必须让你的方法连接到串行端口发送命令等待回复,如果在合理的时间内没有收到回复则超时。希望来自锁的回复具有一致的终止字符,例如 carriage-return,这样您就可以发现这一点并解码您收到的字符串以检查 open1/close1。您必须留出时间来发送命令的字符,然后是带有终止回车符-return 的回复字符的时间稍有延迟。如果超过该时间并且您没有收到响应,则超时并且 return 失败。我已经在单独的线程中使用 Python 状态机 运行 完成了这类事情,因此主程序可以继续关注用户。

在 2)

if (ser.isOpen() == False):

一种风格 - isOpen 是一个相当清晰的方法名称,如果端口打开,它将 return 为真。与其与 False 比较,不如使用 if ser.isOpen(): 或 if not ser.isOpen() 可能更清楚。查看您的代码,很难看出您要实现的目标 - 如果端口未打开,您是否想打开它?在那种情况下,逻辑应该是:

if not ser.isOpen():
    print ('The Port %d is **closed - opening** Stephan: '%COMPORT + ser.portstr)
      #timeout in seconds
    ser.timeout = 10
    ser.open()

else:
    print ('The Port %d is **open** Stephan' %COMPORT)

无论如何,您的 serial_connection() 函数 returns 和您的调用代码调用 ser.write(),因此您在 2 中描述的行为并不奇怪。