2013年3月31日 星期日

Python Serial 自動重連

幾天前,發現 Arduino 的藍芽有的時候會斷線,造成 Python 的上傳軟體當掉,資料上傳不過去
所以想了好久解決.....

主要是運用 pyserial 的timeout 和 writetimeout
當連結斷掉的時候,會造成兩件事:

  1. Python 寫資料給Arduino 的時候會造成writetimeout
  2. Python 讀不到 Arduino 資料的時候會造成timeout
所以我先寫一個副程式叫做 reconnect()
由於 COM PORT 要先關掉才能重連,所以先關掉再開PORT直到成功:
def reconnect():

 global error

 s.close()
 error = 1

 while error == 1:

    try:
      s.open()
      error = 0

    except:
      print "Error connection"
      error = 1  
然後再寫入的部分:

 try:
    s.write("a")
  except:
    print "time out"
    reconnect()
    s.write("a")
而讀取的時候 serial.readline 會自動timeout(要先設定)而跳過
所以不用動

所以總結以上
當Arduino 和 PC 斷線的時候:
寫入失敗=>reconnect()=>再次寫入
讀取失敗=>跳過直到寫入失敗=>reconnect()


不過我還在想有沒有比較好的方法......
畢竟這樣搞,讀11個 data 都 timeout的話
要等至少一分鐘才會重連 =  =




   

沒有留言:

張貼留言