環境
Windows 10
python3.6
Arduino UNO R3
コマンドを送るとどうしても再起動してしまう
pysesialを利用してWindowsとArduino Uno で通信をしようと試みていた。
しかしながらpyserial側でコマンドを送信すると何故か再起動1してしまう。
##原因
pyserialはCOMポートを開く際にDTR信号がLowになる。
しかし、Arduino UNOはDTR信号がLowになるとArduino UNOが再起動してしまう。
これはUNOに採用されているシリアル変換チップがそういった仕様となっているためである。
なのでArduino Leonardo などでは問題にならない。
対処
ser = serial.Serial("COM3",9600)
のように一回で開けるのではなく
ser = serial.Serial()
ser.port = "COM3"
ser.baurate = 9600
ser.setDTR(False) # DTRをセットしない
ser.open()
ser.write(bytes("hoge", 'UTF-8'))
の手順を踏むことで無事通信ができた。
しかしながら、setDTRの利用は推奨されないとのことなので
ser = serial.Serial("COM3",9600,dsrdtr = True) # dsrdtrの初期値はFalse
# コメント頂いたので修正(自身の環境では未検証)
で対応をするべきだろう。
##余談
pySerial API 公式ドキュメント
によると
Some OS and/or drivers may activate RTS and or DTR automatically, as soon as the port is opened. There may be a glitch on RTS/DTR when rts or dtr are set differently from their default value (True / active).
一部の環境ではポートを開けたときにDTRがTrueになってしまう事があるらしい。
これが原因なのかもしれない。後日検証したい。
参考にしたサイト
DTR と Arduino の関係 - eggshell blue
DTR and RTS control lines toggle unintentionally when opening port - Github/pyserial
-
ボードに書き込み直後と同じ点滅の仕方であったので再起動したと判断した。 ↩