使用pyserial:打印结果
Working with pyserial: printing result
我对以下代码有以下疑虑:
我怎样才能打印出接收到的结果,比如如果我输入 status1,它应该 return close1/open1?我正在使用的 USB 控制器连接了锁,有一组命令可以通过 ASCII.Such 进行通信,就像我发送命令 status1 一样,它应该返回 open1/close1。
在条件行 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 中描述的行为并不奇怪。
我对以下代码有以下疑虑:
我怎样才能打印出接收到的结果,比如如果我输入 status1,它应该 return close1/open1?我正在使用的 USB 控制器连接了锁,有一组命令可以通过 ASCII.Such 进行通信,就像我发送命令 status1 一样,它应该返回 open1/close1。
在条件行
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 中描述的行为并不奇怪。