2011-01-22 13 views
1

私はArduinoとPythonの初心者ですが、アイデアはありますが、動作させることはできません。基本的に、Arduinoのボタンを押すと、シリアルポートから「4」が送信されます。私がPythonで欲しいのは、それが4を読み込むとすぐに、何かするべきです。これは私が今までに得たものです:ArduinoからPythonで送られた最新のキャラクタを読む

import serial 
ser = serial.Serial('/dev/tty.usbserial-A900frF6', 9600) 
var = 1 
while var == 1: 
    if ser.inWaiting() > 0: 
    ser.readline(1) 
    print "hello" 

しかし、明らかにこれは何が関係なく印刷されます。私が必要とするものは次のようなものです:

import serial 
ser = serial.Serial('/dev/tty.usbserial-A900frF6', 9600) 
var = 1 
while var == 1: 
    if ser.inWaiting() > 0: 
    ser.readline(1) 
    if last.read == "4": 
    print "hello" 

しかしlast.readをどのように定義できますか?

答えて

1

それはブロッキング・コールではありませんので、私は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の送信コードがビットを扱っているので、いくつかのバイトが必要であることに注意してください。

+0

は、あなたがこれを説明してもらえますが、もう少しありますか?そしてなぜアナログセンサーを使用する必要がありますか?申し訳ありません、初心者ここ:)他のスレッドを見ましたが、実際には私の問題を解決するように見えませんでした。 – HankSmackHood

0

私はそれがこの変更で動作するかもしれないと思う:

import serial 
ser = serial.Serial('/dev/tty.usbserial-A900frF6', 9600) 
var = 1 
while var == 1: 
    if (ser.inWaiting() > 0): 
    ser.readline(1) 
    print "hello"