0

私はArduinoとPythonに非常に慣れていません。Pyserial を使用して、Arduino Uno とラップトップの間の通信に取り組んでいます。私のラップトップの Python スクリプトは、Novint Falcon にリンクされている H3D Viewer によって呼び出されます。

私のラップトップは Falcon の位置データを Arduino に送信し、ロボットに送信します。今は、Arduino から送信したデータを読み返して、すべてが機能することを確認しているだけです。しかし、そうではありません!

これは私の Python スクリプトの一部です (.x3d ファイルによって呼び出されます)。

dp_text, = references.getValue()

class display (threading.Thread): 
  def __init__(self, delay):
    threading.Thread.__init__(self)
    self.delay = delay

  def run(self):
    while 1:

        receivedFalconData=[]
        tex=[]
        tex.append("DevicePosX = " + str(localFalconData))

        receivedFalconData=ser.readline()
        ser.flush()
        ser.flushInput()
        tex.append("Input = " + str(receivedFalconData))

        dp_text.string.setValue(tex)
        time.sleep(self.delay)

displaying = display(0.1)
displaying.start()

上記のスレッドは、H3D ビューアーのテキスト ノードを 100 ミリ秒ごとに更新する役割を果たします。Arduinoのコードは次のとおりです。

#include <SoftwareSerial.h>

char Axispos[6] ={0,0,0,0,0,0};
int xvalue= 0;

SoftwareSerial mySerial(7,6); //RX, TX

void setup() {

  Serial.begin( 9600 );
  Serial.flush();
  mySerial.begin(9600);
}

void loop(){

  while( Serial.available() > 0 ) 
  {
    Serial.readBytes(Axispos,6);
    Serial.flush();

    xvalue = (Axispos[0] << 8) + (Axispos[1] & 0xff);

    Serial.println(xvalue);
    Serial.flush();

    mySerial.write(Axispos);
    mySerial.flush();

    delay(500);

  }
}

Arduino によって読み取られた x 軸の値はラップトップに送り返され、receivedFalconData に格納されます。この値は、スクリプト自体の x 軸の値である localFalconData と同じであると想定されています。

結果: receivedFalconData は数秒間 localFalconData を模倣した後、ワイルドになります。

ただし、正しい値が再び表示されることがありますが、これはおそらく Pyserial の入力バッファ オーバーフローの問題であることがわかりますか? (私が正しければ) serial.readline() は入力バッファを読み取った後に空にするので、これはどうしてでしょうか? さらに、Arduino は 0.5 秒ごとにデータを送信するだけですが、ラップトップは 0.1 秒ごとに読み取ります。

しかし、readline() 部分がデータ送信用のクラスに配置されている場合 (Falcon が新しいデータを利用できるようになるたびに呼び出されます)、 receivedFalconData は完全に正しいです。

また、H3D で表示すると、receivedFalconData の後ろにこれらの ☐ 記号が 2 つ表示されます...

Pyserialの経験がある人は、私を助けてください。私の問題がまだ不明な場合は、喜んでさらに情報を提供します。

4

0 に答える 0