2017-04-05 8 views
1

私は、シリアルポート経由でWindows 10のpythonから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); 
     } 
    } 

これはハックのようなもののように感じているが、「0」が開始されるためのArduinoが実際に受信されているものであるASCIIテーブル(その2 = 50、など)、上の48で動作します私はいくつかの数字を送信するために、次の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を使用しているとき、私のLEDをオンにし、使用してN = 4がそれをオフにしないことを発見しました。これは、 "2バイトが送信されました"のように、私がnのために選択した番号に関係なく常に2を返します。私が抱えている問題は、これはpython 3.4ですごく素敵なことですが、Python 2.7を使ってこのプロジェクトを自分のラップトップにロードしようとしたとき、私は '2L'の代わりに '2'オンになります。

私のラップトップとデスクトップの両方でpySerial 3.3が使用されていますが、デスクトップ上でPython 2.7を使用すると同じことが起こる(動作しない)ことを確認しました。ラップトップ。

私は後で追加したいハードウェア/ APIのため、このプロジェクトにはPython 2.7を使用する必要があります。この 'L'の意味はシリアルリターンに追加されています。なぜこれがPython 2.7?要するにhttp://playground.arduino.cc/interfacing/python

、3つの文字列はUnicodeとのpython 2文字列ではないですのpython:

答えて

1

だから将来的にこの出くわす誰のために、私は最終的にすべての場所のArduinoのウェブサイト上で答えを見つけました。

"L"私が私の質問で述べたのは、 "リテラル"の略で、文字列が0-255のASCIIバイトではなくリテラル文字列形式で送られてきたことを意味します。そのため、Arduinoのシリアルデータの解釈は、Python 2のほうがはるかに簡単です。個々のバイトを読み込むためにserial.Read()を使用する代わりに、serial.parseInt()を使用して文字列をintに変換できます。この機能にはデフォルトで1秒のタイムアウトがありますが、セットアップブロックにSerial.setTimeout(n)を追加することはできますが、ここでnは待機するミリ秒数です(これは特定のケースでは重要です。有効にする)。

ser.write( '2')は、Python 3で私の質問に示したように、Python 2と同じ機能を実行します。0またはエンコーディングで正当化する必要はありません。

関連する問題