teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

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

2019/12/27 03:37

投稿

thkana
thkana

スコア7735

answer CHANGED
@@ -85,5 +85,6 @@
85
85
  (この機にスレッドセーフ、という言葉について調べてみるといいかもしれません。)
86
86
 
87
87
  [余談]
88
- イベントハンドラserialEvent()の中でSerial.readStringUntil()メソッドを使っています。このメソッドは指定文字が来るまでひたすら待ちに入る可能性もあり、プログラムの進行を阻害することがあります。
89
- 今回の使い方ではシリアルデータがたかだか6バイト毎に'\n'を含むはずで、1ms以下の処理であるはずだから問題ないという判断はあったのかとは思いますが、一般論としてはイベントハンドラ中で長時間の処理が行われないように注意すべき、というのは言っておいてもいいかと思います。(直結のUARTならいいですけど、TCP/IPの通信でこのパターンを使うとかはちょっと考えたほうがいいですね)
88
+ イベントハンドラserialEvent()の中でSerial.readStringUntil()メソッドを使っています。~~このメソッドは指定文字が来るまでひたすら待ちに入る可能性もあり、プログラムの進行を阻害することがあります。~~ (勘違いにつき以下削除、書き換え。readStringUntil()はブロックしない)
89
+
90
+ 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 != "")`と絡み合うとぬるぽで止まる、ということになるようですね。