2015-07-03 16 views
1

我有下面的代碼如下擔憂:與pyserial工作:打印結果

  1. 我將如何能夠打印出什麼接收到這樣的結果,如果我輸入狀態1,它應該返回close1/open1?我正在使用的USB控制器具有連接到它們的鎖具有一組可以通過ASCII進行通信的命令。就像我發送命令status1一樣,它應該反饋回open1/close1。

  2. 在條件行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') 

在此先感謝和任何澄清,請告知。

回答

0

on 1)您必須使連接到串行端口的方法發送一個命令等待答覆,如果沒有在合理的時間內收到一個命令,則需要超時。希望來自鎖的回覆具有一致的終止字符,如回車符,以便您可以發現並解碼您收到的字符串以檢查open1/close1。您必須留出足夠的時間來發送命令的字符,稍微延遲一段時間,以便終止回車的回覆字符。如果比這更長,並且你沒有得到響應,那麼超時並返回失敗。我使用Python狀態機完成了這種事情,它運行在一個單獨的線程中,因此主程序可以繼續關注用戶。

2)

如果(ser.isOpen()==假):

樣式的東西 - ISOPEN是將返回,如果真有一個比較清楚的方法名港口是開放的。如果使用ser.isOpen():或者不使用ser.isOpen(),則可能會更清楚地使用False。看着你的代碼,很難看到你想要達到的目標 - 是否如果端口沒有打開,你想打開它?在這種情況下,邏輯應該是:

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描述的行爲也就不足爲奇了。

+0

另請注意,串行端口通常無法確定它們是否實際連接到某些東西 - 除非例如您知道您連接的設備具有非默認設置,用於RTS/CTS等額外狀態行。由於它們被插入的特性,它們可能會被拔出或斷電,所以當您發送命令時,您必須等待一段時間才能查看是否有任何事情返回,並優雅地處理部分響應。 – barny

+0

調試串行端口的好方法是將運行python的PC連接到終端(例如另一臺PC)或使用虛擬串行端口(如com0com),將PC上的終端應用程序連接到應用程序正在與之交談的虛擬端口。然後你可以假裝成鎖裝置(延長超時時間以允許時間延遲)。 – barny