2014-02-27 74 views
1

我想構建一個短代碼,它將測試所有串行COM端口(我在windows上)的回覆。例如,我在COM3上連接了一個Arduino,當它連接時,它會發送一個串行消息。Python:測試串行端口的答案

我希望當我運行python腳本時,它會自動檢測哪個是正確的COM端口。

我有列出所有端口的功能,但是我無法讓它工作來測試它們,並檢測arduino連接到哪個端口。

的Python:

import serial 
import time 
import _winreg as winreg 
import itertools 
import datetime 

def enumerate_serial_ports(): 
    """ Uses the Win32 registry to return an 
     iterator of serial (COM) ports 
     existing on this computer. 
    """ 
    path = 'HARDWARE\\DEVICEMAP\\SERIALCOMM' 
    try: 
     key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, path) 
    except WindowsError: 
     raise IterationError 

    for i in itertools.count(): 
     try: 
      val = winreg.EnumValue(key, i) 
      yield str(val[1]) 
     except EnvironmentError: 
      break 

connected = False 

for porta in enumerate_serial_ports(): 
    print "TRYING PORT: " + porta 
    start = datetime.datetime.now() 
    delta=0 
    ser = serial.Serial(porta,9600,timeout=0) 
    if ser.isOpen(): 
     while ser.isOpen() and delta < 1: 
      delta = (datetime.datetime.now()-start).seconds 
      r = ser.read() 
      if r == None: 
       print "connected!" 

Arduino的代碼

void setup(){ 
    // Open serial connection. 
    Serial.begin(9600); 
    pinMode(13, OUTPUT); 
    Serial.write(6); 
} 

void loop(){ 

} 

謝謝!!

回答

3

這是一個常見的問題,因爲串口沒有「連接」。正如你所看到的,當你打開()一個串行端口時,這與導線另一端是否插入了某些東西沒有任何關係。所有open()調用都在建立該機器內部串口硬件的句柄。 open()對電纜的另一端沒有任何保證。

「連接」的概念是您必須創建的。連接通常是由兩個設備之間的某種協議握手創建的,這兩個設備之間建立了雙方都在與他們期望的對話。

兩種常用的方法有:

  • 探頭和檢查響應
  • 偵聽信

我在此相關的問題警告說,在一個未知的推動字節的第一種方法設備不是最安全的方法:

Related question

您已經選擇了第二種方法,Python側被動地監聽信標。您需要與此類似,在那裏您會收到一些預定義的消息,當您收到響應:

// loop for a short time listening for a * 
if r != None: 
    if r.endswith("*"): 
     ser.write("I_hear_you") 
     print "connected" 

Arduino的側上電和廣播信標。它繼續廣播,直到有人接聽

beaconmode = True; 

void loop() { 
    if (beaconmode) { 
    delay(1000); 
    Serial.write("*"); 
    // Serial.read() and check for "I_hear_you" 
    if (someone heard my beacon) { 
     beaconmode = false; 
     // now the two devices are "connected" 
     connectedmode = true; 
    } 
    if (connectedmode) { 
    // do normal stuff 
    } 
} 

如果你正在尋求更加穩健,這握手可以擴大一步。事實上,它只是證實了Python方面聽過Arduino方面。增加的步驟是讓Arduino通過發送「我聽說你聽到了我」來承認。然後你會得到類似於3次握手用來建立TCP連接的東西。 。