2010-02-24 75 views
4

我想通過Python中的pyserial發送一些數據到Arduino。我希望Arduino所做的就是從串口讀取可變長度的字符串數據,並將其寫回以便Python可以讀取它。由於我一直無法做到這一點,下面的代碼只有Python發送字符。這裏的Python代碼:Arduino和Python之間的回聲程序

import serial 
import sys 
import pywapi 
import time 

def main(): 
    ser = serial.Serial(3, 9600, timeout=1) 
    print "Conn established" 
    print "Sending: %s" % "z".__repr__() 
    print ser.write('z'.encode("ascii")) 
    time.sleep(2) 
    print "Received: %s" % ser.read(10).__repr__()   
    ser.close() 

這裏的Arduino的代碼:

void setup(){ 
    analogReference(DEFAULT); 
    Serial.begin(9600); 
} 

void loop(){ 
    if(Serial.available() > 0) 
    Serial.println("x"); 
    while(Serial.available() > 0){ 
    Serial.print(Serial.read(), BYTE); 
    } 
} 

輸出:

Conn established 
Sending: 'z' 
1 
Received: '' 

我知道Arduino的代碼工作,因爲它的工作原理是在發送數據時從Arduino終端。然而,當我嘗試從Python發送任何東西的時候,它就會失敗。我一整天都在苦苦掙扎。任何幫助將不勝感激。

+0

「奇怪的結果」是什麼意思?也許這是一個握手問題 – 2010-02-24 23:53:36

+0

對不起,奇怪的結果意味着我在這裏發佈的東西,即沒有。 – JohnS 2010-02-25 00:48:54

+0

什麼是您的操作系統? Windows或* nix? – Earlz 2010-02-25 19:07:11

回答

3

嘗試增加或刪除超時值,並將讀取大小設置爲1.您可能還想增加休眠延遲,甚至實現簡單的讀取循環。

喜歡的東西:

try: 
    while True: 
     data = ser.read(1).__repr__() 
     if data: 
      print "Received: %s." % data 
     else: 
      print "Looping." 
except KeyboardInterrupt: 
    print "Done." 
except: 
    raise 
finally: 
    ser.close() 
    print "Closed port." 

然後,只需使用Ctrl-C停止它。

+0

出於某種原因,第一次閱讀總是返回''。在爲測試目的而實現第二次讀取之後,它開始工作(儘管在python程序啓動時我仍然必須進行虛擬讀取)。 – JohnS 2010-02-27 22:52:52

+0

也許它與「Serial.println(」x「);」在Arduino代碼中。 Python應用程序是否打印您在連接時發送的'x'?如果不是,那麼Python應用程序正在拾取在'x'之後發送的換行符。或者,如果您仍然在Python串行連接上設置超時,讀取可能會超時。 – 2010-02-28 05:55:08

3

我會建議使用PC上的一個單獨的串行端口和串行通信軟件獨立驗證這兩個部分。

E.g.如果您的PC有兩個串行端口,則使用空調制解調器(環回)電纜連接它們。或使用com0com製作一對鏈接的虛擬串行端口。在一個串口上運行你的Python軟件,在另一個串口上運行終端程序(Hyperterminal或RealTerm)。手動驗證Python程序的操作。

然後,像往常一樣直接將PC連接到Arduino,並使用終端軟件手動驗證Arduino軟件的操作。

該過程將允許您縮小問題的範圍。一旦你證實了他們兩人,他們應該一起工作。

串行端口監視器

另一個可以使用的方法是軟件,掛接到PC的串口驅動程序,並允許您監視串行端口的流量。我以前使用過HHD Software公司的Free Serial Port Monitor軟件,它對我們的目的非常有效。它允許您監視任何PC的串行端口,並向您顯示在兩個方向上通過端口的串行數據的日誌(十六進制和文本)。

0

您是否需要將發送的字符從任何保持的串行緩衝區中清空?

這可能是你的角色實際上並沒有離開COM端口併到達Arduino。當你用Arduino終端(我假設你是指開發環境中的UI終端)進行測試時,你實際上正在發送你的字符串+我想的回車符,而不僅僅是字符。 (即,在測試中鍵入'z'後,您是否打回來?)

嘗試ser.flush()或者也可以發送\ r字符。從你的測試Arduino工作得很好,它是似乎沒有發送任何東西的Python程序。

0

您可能需要發送兩次的原因是,如果您通過USB連接,第一個串行連接將重置Arduino。