今回はArduinoが送信したデータをPCで受信してみたいと思います。
要件
- PCとarduinoでシリアル通信を行う
- ボーレートは9600bps
- Arduinoからの送信は1s周期とする
- PC側のプログラムはPython3で作成する
ハードウェア
- Arduino uno
- USB-シリアル変換基板(AE-UM232R)
- ブレッドボード
- ジャンパワイヤ(適量)
- USBケーブル×2(ArduinoへのプログラムDL&電源供給用とシリアル通信用)
arduino側のプログラム
void setup() { Serial.begin(9600); // シリアル通信を使える様にする } void loop() { Serial.println("Hello!"); delay(1000); }
PC側のプログラム
あらかじめPython3のserialモジュールをインストールしておく必要があります。
$ sudo pip3 install PySerial
import serial ser = serial.Serial('/dev/ttyUSB0',9600,timeout=None) # '/dev/ttyUSB0'の部分は自分の環境に合わせて変更する while True: line = ser.readline() print(line) ser.close() # 無限ループだから到達しないけど一応・・・
動かす
python3 serial_rx.py
結果
b'Hello!\r\n' b'Hello!\r\n' b'Hello!\r\n' b'Hello!\r\n' b'Hello!\r\n' b'Hello!\r\n'
timeoutパラメータについて
シリアルポートをオープンするときのパラメータでreadメソッドのタイムアウト時間を指定することができます。
- timeout = None: 受信完了するまで待つ
- timeout = 0: 直ちに処理が返る。ノンブロッキングモード。
- timeout = x: x秒でタイムアウト
<参考>
http://pyserial.readthedocs.io/en/latest/pyserial_api.html#serial.Serial
今回作ったプログラムではtimeout=Noneを指定しましたが、これだと何も受信がない場合ずっとそこで待ち続けることになってしまいます。一般的にデータの受信はいつ発生するかわからないので、受信を待っている間は別の処理を行っておきたいです。そのためにはtimeoutにNone以外を設定します。
メインループで受信の状態をポーリングしながら別の処理を行う方法は以下のとおりです。
import serial ser = serial.Serial('/dev/ttyUSB0',9600, timeout=0) # while True: line = ser.readline() if 受信あり/なしの判定: # ここに受信があった時の処理 else: # ここに受信がなかった時の処理 ser.close()
コメント