9

私はArduinoプロジェクトに取り組んでいますが、メモリの制限のため、Pythonスクリプトとのインターフェースを取っています。Python側では、座標のそれぞれのx、y値を含む2次元の行列があり、このリストには26000の座標ペアがあります。したがって、すべての人のデータ構造を明確にするために、、pathlist[0][0]は私のリストの最初の座標のX値を返します。このリストでPythonでさまざまな操作などを実行しても、問題はありません。しかし、私が問題にぶつかっているのは、これらの値をシリアル経由でArduinoに送信することです。これは便利な方法です。

シリアル通信の性質上(少なくともこれが当てはまると思います)、各整数を文字列として、一度に1桁だけ送信する必要があります。したがって、345のような数字は、3つの個別の文字として送信されます。もちろん、3、4、5の順になります。

私が苦労しているのは、Arduinoでそれらの整数を再構築する方法を見つけることです。

値を送信するたびに、データを受信して​​次のように出力します。

  //Python is sending over the number '25'
  2ÿÿ52
  //Python is sending the number 431.
  4ÿÿ321ÿÿÿ2

Arduinoコードは次のとおりです。

String str;
int ds = 4;

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

void loop(){
    if (Serial.available()>0) {
        for (int i=0; i<4; i=i+1) {
            char d= Serial.read();
            str.concat(d);
        }

        char t[str.length()+1];
        str.toCharArray(t, (sizeof(t)));
        int intdata = atoi(t);
        Serial.print(intdata);
    }
}

そして、Pythonコードは次のようになります。

 import serial

 s = serial.Serial(port='/dev/tty.usbmodemfd131', baudrate=9600)

 s.write(str(25))

問題はoutputメソッド()に起因するものではないとほぼ確信していSerial.printます。別のintを宣言すると、出力で正常にフォーマットされるため、問題はintdata変数の構成方法にあると考えられます。

この問題の診断に役立つ可能性のある注意点の1つは、結果を変更Serial.print(intdata)すると、30(25 + 5)になると予想されることです。この7は、入力に関係なく存在します。たとえば、シリアルに271を書き込むと、結果は次のようになります。Serial.print(intdata+5)2ÿÿ57

//For input 271.
2ÿÿ771ÿÿÿ7

Arduinoは値を2つのペアにチャンクし、最後に長さを追加しているように見えます。なぜそうなるのか理解できません。

またÿ、forループにが追加されているように見えます。その時点では何も送信されていないため、追加されていることを意味します。しかし、さらに別のif(Serial.available()>0)条件を追加してそれを修正しても、結果は整数のようには扱われません。

また、ここではピクルスを使用するのが適切でしょうか?私は何が間違っているのですか?

4

2 に答える 2

5

シリアルデータが到着するまで少し待つ必要があります。

Arduinoコードは次のようになります。

if (Serial.available()){
    delay(100); // Wait for all data.
    while (Serial.available()) {
        char d = Serial.read();
        str.concat(d);
    }
}

また、文字列を再利用する前に、文字列をクリアする必要があります。

[編集]

ÿ==-1== 255と言うのを忘れましたSerial.read()。これは、何も読み取れないと言っていることを意味します。

于 2011-05-18T17:22:01.133 に答える
5

Pythonが数値間で改行を送信するように通信を変更するので、タイミングにそれほど依存しません。

s.write(str(25)+'\n')

そして受信側で:

void loop(){
    while (Serial.available() > 0) {
        char d = Serial.read();
        if (d == '\n') {
            char t[str.length()+1];
            str.toCharArray(t, (sizeof(t)));
            int intdata = atoi(t);
            Serial.print(intdata);
            str = String();
        }
        else {
            str.concat(d);
        }
    }
}
于 2011-05-23T18:18:18.880 に答える