我对以下代码有以下担忧:
我如何打印出收到的结果,例如,如果我键入status1,它应该返回close1 / open1?我正在使用的USB控制器已连接了锁,它们具有一组可以通过ASCII进行通信的命令,就像我发送命令status1一样,它应该回传open1 / close1。
在条件行中,if (ser.isOpen() == False):
它不会完全检查端口是否打开,因为即使没有任何连接,它也会绕过该行并尝试发送明显返回错误的命令
以下是代码(我使用的是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)您必须使连接到串行端口的方法发送命令以等待答复,如果在合理的时间内未收到答复,则超时。希望锁中的回复具有一致的终止符,例如回车符,以便您可以发现该错误并解码收到的字符串以检查open1 / close1。您必须留出时间来发送命令的字符,这要稍稍延迟一些时间,然后再用终止回车符的返回时间来保留字符。如果经过的时间更长,并且您没有响应,则超时并返回失败。我已经使用Python状态机完成了这种事情,该状态机在单独的线程中运行,因此主程序可以继续关注用户。
在2)
线
如果(ser.isOpen()== False):
样式项-isOpen是一个相当清晰的方法名称,如果端口打开则将返回true。与其与False进行比较,不如使用ser.isOpen()或不使用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()函数都会返回,并且您的调用代码将调用ser.write(),因此您在2中描述的行为不足为奇。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句