TeamKuOn / Concordia

2022 Solar Car Race in Akita & Shirahama
MIT License
0 stars 0 forks source link

シリアル受信割り込み処理 #1

Open xwasoux opened 2 years ago

xwasoux commented 2 years ago

シリアル通信にて受信イベントが発生した場合に割り込み処理を行いたいと考えた.

Arduino では serialEvent() という関数が標準で実装されており,日本語リファレンス では データが利用可能な時に呼び出される関数を定義することができる と書かれている.

しかし,公式リファレンス では Called at the end of loop() when data is available. (loop()の最後で、データが利用可能になったときに呼び出される。) と書かれている様にloop関数が終了したタイミングで実行されるため,全く割り込み処理を行っている訳ではないことが分かった. この関数について調査した ブログ でも, この機能を使えばシリアル受信で割り込み処理を行えると思っていたのですが、それは勘違いで、serialEvent()が実行されるのはloop()文の処理が終わってからです。ですので割り込み処理のように、即座に処理を行うことが出来ません。 という実験結果が書かれている.

つまり,シリアル通信による割り込み処理はこの関数では実行できないということである.

xwasoux commented 2 years ago

一時的な解決方法

解決方法の一つとして,xTaskCreate() でセンサデータ取得用のタスクを生成し,xSemaphoreTake で通信中のみ他のポートの仕様を弾くようにすれば受信は可能となった. セマフォを使用する場合は長い処理の場合,他の通信やグローバル変数の仕様に支障をきたす可能性があるため,最小の処理にとどめる必要がある.

ただし,動作確認できたのは UAST のみなので,他の通信方法でも試す必要はある.

他の通信