2017-04-05 79 views
1

我的工作,需要從蟒蛇在Windows 10,通過串口發送一些數據到一個Arduino UNO的項目。作爲一個簡單的測試只想通過發送「2」,以打開的LED打開和關閉狀態通過發送從命令提示「4」,雖然我想能夠最終使用任意數量的0-99用於不同的目的。這裏是我的Arduino代碼:pySerial差異與Python 2.7和3.4

const int ledPin = 13; 
    byte b1, b2; 
    int val; 

    void setup() { 
     Serial.begin(9600); 
     pinMode(ledPin, OUTPUT); 
    } 

    void loop() { 
     if (Serial.available() > 1) { 
     b1 = Serial.read(); 
     b2 = Serial.read(); 
     val = ((b1-48)*10) + (b2-48); 

     if (val == 2) { 
      digitalWrite(ledPin, HIGH); 
     } 

     if (val == 4) { 
      digitalWrite(ledPin, LOW); 
     } 
    } 

這感覺就像樣的黑客,但工作於48,因爲「0」開始的ASCII表(SO 2 = 50,等等),這是什麼Arduino是實際接收當我用下面的Python代碼發送一些數字:

import serial 
    ser = serial.Serial('COM4',9600) 
    n = 2 
    s = str(n) 
    t = s.rjust(2,'0') 
    ser.write(t.encode()) 

所以我發現我的桌面上使用python 3.4時,使用N = 4將其關閉這確實對我的LED轉向。無論我爲n選擇的數字如何,總是返回'2',如「2個字節已發送」,這正是我想要的。我遇到的問題是,這是所有罰款和花花公子在Python 3.4,但是當我試圖使用Python 2.7,我收到了「2L」迴歸,而不是僅僅「2」,以及LED不再裝在我的筆記本電腦項目打開。

我的筆記本電腦和臺式機都使用pySerial 3.3,並且我已經證實,當我在桌面上使用python 2.7時會發生同樣的事情(不起作用),並且在我使用python 3.4筆記本電腦。

我需要爲這個項目使用python 2.7,因爲我想稍後添加一些額外的硬件/ API,那麼這個'L'的附加在串行返回上的意義是什麼,爲什麼這不適用於python 2.7?

回答

1

因此,對於任何人碰到這個即將到來的未來,我終於找到所有地方的Arduino的網站上的答案:http://playground.arduino.cc/interfacing/python

總之,蟒蛇3串都是Unicode和Python 2串都沒有。

的「L」我在我的問題提到的,我相信代表「文字」,意思是一個字符串已在其文本字符串的形式被髮送,而不是一個0-255價值ASCII字節。因此,在解釋Arduino的串行數據是與Python 2而不是使用serial.Read()讀取單個字節更加簡單,這個應用程序,你可以只使用serial.parseInt()將字符串轉換爲int。此功能在默認情況下1秒的超時時間,雖然你可以在你的安裝塊添加Serial.setTimeout(n),其中n是毫秒要等待(其數量是我的具體情況重要 - 我發現5有效)。對於python部分,ser.write('2')與python 2執行相同的功能,正如我在python 3中所顯示的那樣 - 不需要使用0或編碼進行調整。