それはブロッキング・コールではありませんので、私はreadLine
で途切れを同期させる良い方法を知りません。ブロッキングコールであるser.read(numBytes)
を使用できます。 Arduinoがバイトストリームを正しくデコードするために送信しているバイト数を知る必要があります。ここでは8つのバイトを読み取り、
try:
data = [struct.unpack('<HHL', handle.read(8)) for i in range(PACKETS_PER_TRANSMIT)]
except OSError:
self.emit(SIGNAL("connectionLost()"))
self.connected = False
ここではPython
2つの符号なしのショートパンツと長い(
<HHL
部分)にそれらをアンパック簡単な例は、それに行く
struct.unpack()
Arduinoのコードへの参照ですあります。 2つのアナログセンサー値とマイクロタイムスタンプを読み取り、それらをシリアル経由で送信します。
unsigned int SensA, SensB;
byte out_buffer[64];
unsigned int buffer_head = 0;
unsigned int buffer_size = 64;
SensA = analogRead(SENSOR_A);
SensB = analogRead(SENSOR_B);
micr = micros();
out_buffer[buffer_head++] = (SensA & 0xFF);
out_buffer[buffer_head++] = (SensA >> 8) & 0xFF;
out_buffer[buffer_head++] = (SensB & 0xFF);
out_buffer[buffer_head++] = (SensB >> 8) & 0xFF;
out_buffer[buffer_head++] = (micr & 0xFF);
out_buffer[buffer_head++] = (micr >> 8) & 0xFF;
out_buffer[buffer_head++] = (micr >> 16) & 0xFF;
out_buffer[buffer_head++] = (micr >> 24) & 0xFF;
Serial.write(out_buffer, buffer_size);
Arduinoの遊び場と処理フォーラムは、この種のコードについても見逃しの良い場所です。
更新 私はreadLine
でブロックしていない可能性があります。いずれにしても、上記のコードはうまくいくはずです。私は同じことについては、この上にother threadが見つかりました。
UPDATEアナログセンサーを使用する必要はありません。これは、私が使っていたプロジェクトのようなものです。だからArduinoのコードは、出力が送信される前に格納されているタイプbyte
のバッファを持っています。センサの値とマイクロはバッファに書き込まれ、バッファはシリアルに送られます。 (SensA & 0xFF)
は、SensA
値のビットパターンを取得し、ビットパターンを0xFF
または255でマスクするビットマスク演算子です。 EssetianllyこれはArduino shortであるSensA
の16ビット値から最初の8ビットを取ります。次の行は同じことをしますが、ビットを8ポジションだけ右にシフトして、最後の8ビットをとります。
ビットパターン、ビットマスキング、ビットシフトを理解する必要があります。その後、バッファはシリアルに書き込まれます。
Pythonコードは、シリアルポートからビットを一度に8ビット読み込みます。 struct.unpackドキュメントを見てください。理解のためには、複数の値セットを送信できるだけです。 ArduinoボードとPythonコードが同期していないので、送信ごとに複数の「回線」を送信できるように追加しました。あなたはstruct.unpack('<HHL',handle.read(8))
と置き換えることができます。 'handle.read() 'には、Arduinoの送信コードがビットを扱っているので、いくつかのバイトが必要であることに注意してください。
は、あなたがこれを説明してもらえますが、もう少しありますか?そしてなぜアナログセンサーを使用する必要がありますか?申し訳ありません、初心者ここ:)他のスレッドを見ましたが、実際には私の問題を解決するように見えませんでした。 – HankSmackHood