回答編集履歴

1

関数仕様の勘違いがあったので修正

2019/12/27 03:37

投稿

thkana
thkana

スコア7639

test CHANGED
@@ -172,6 +172,8 @@
172
172
 
173
173
  [余談]
174
174
 
175
- イベントハンドラserialEvent()の中でSerial.readStringUntil()メソッドを使っています。このメソッドは指定文字が来るまでひたすら待ちに入る可能性もあり、プログラムの進行を阻害することがあります。
175
+ イベントハンドラserialEvent()の中でSerial.readStringUntil()メソッドを使っています。~~このメソッドは指定文字が来るまでひたすら待ちに入る可能性もあり、プログラムの進行を阻害することがあります。~~ (勘違いにつき以下削除、書き換え。readStringUntil()はブロックしない)
176
176
 
177
- 今回の使い方ではシリアルデータがたかだか6バイト毎に'\n'を含むはずで、1ms以下の処理であるはずだから問題ないという判断はあったのかとは思いますが、一般論としてはイベントハンドラ中で長時間の処理が行われないように注意すべき、というのは言っておいてもいいかと思います。(直結のUARTならいいですけど、TCP/IPの通信でこのパターンを使うとかはちょっと考えたほうがいいですね)
177
+
178
+
179
+ Serial.readStringUntil()は、[公式のリファレンス](https://processing.org/reference/libraries/serial/Serial_readStringUntil_.html)によれば"Returns null if it doesn't find what you're looking for. "とのことなので、例えば"10,12\r\n"の'1'~'\r'を受信するとそれぞれserialEvent()が起動してreceiveMessageがNULLになる、ということでそのタイミングが先の`if (receiveMessage != null && receiveMessage != "")`と絡み合うとぬるぽで止まる、ということになるようですね。