*

C言語でEV3開発(19)-コマンド通信処理でEchoBackしてみた

公開日: : 最終更新日:2017/07/15 マインドストーム/EV3, 開発

どもです。
前回は、Bluetoothの接続状態の変化に伴う、状態遷移について書きました。
今回は、BluetoothでPCとEv3を接続してコマンドの送受信をしてみます。

1.コマンド
送受信するコマンドは、一番基本(と、考えている)の「EchoBack」コマンドです。
このコマンドでは、コマンドデータに乗せたデータがそのまま返されます。
コマンドフォーマットは、特に何かの規格に準拠する、というものではなく、完全に独自仕様としています。
具体的には、以下のように設計しています。

コマンドフォーマット

2.通信設計
通信をする場合には、送信側と受信側が存在します。
(当たり前ですね。)
そのため、通信を設計する際には、どちらを送信側にして、どちらを受信側にするかを決める必要があります。
「適宜切り替える」というのが、「もっともよい、あるべき姿」です。しかし、この方式を実装するとなると、通信の制御がとても難しくなる。「送信の衝突」を「0」から設計、実装することはできません。スキルが足りません。
なので、今回は以下のように固定します。

  • PC:送信
  • Ev3:受信

PC側からEv3にコマンドを送信し、対応する処理を実施した後に結果/レスポンスを返すようにします。
コミュニケーション図は、下図の通りです。
コマンドシーケンス

送信側は、送信間隔を10msecに設計します。
従って、送信側は、コマンドを送信、レスポンスを受信後、10msec待ってから次のコマンドを送信します。

受信側は、受信したデータを、そのままレスポンスデータに乗せて返します。
コマンドデータを受信してからレスポンスを受信するまでは、特に間隔を設けません。受信した先から、返信していきます。
ただし、次のコマンドを受信するまでは、少~し間隔を設けています。
また、Ev3では受信したデータをデバッグできません。
そのため、その代わりにコマンドを受信した回数をモニターするようにしました。

3.コマンド処理
実際にコマンドを受信、処理して返すまでの実装は、以下の通りです。

処理の概要を説明すると、port_check_connectoin()でBluetoothの接続を確認し、port_read_data()でデータの読出しを行います。
データを受信していた場合には、cmd_sequence()で内容の確認とレスポンスデータの作成を行います。
cmd_sequence()の実装は、下記の通りです。

cmd_latch_buff()、cmd_reset_snd_buff()は、それぞれ関数名通りの処理を実施します。
で、cmd_handle_main()の中で実際にデータの処理を行います。
そのコードが、以下です。

4.実際に動かしてみた
実際に動かしている様子の動画は、以下の通りです。

映像の後ろの方に映っているのは、PCツールで送信/受信しているデータです。
Ev3では、BLT_TSK_CNT、CMD_HDL_CNTの値が増加しています。この値は、コマンドの受信/送信タスクと、実際に受信/送信(返信)したコマンドの数です。
PCツールからコマンドを送信、レスポンスを受信するタイミングと、Ev3の画面上のこれらの値が更新されるタイミングが一致しています。
このようにして、PCツールからEv3に対してコマンドデータを送信することが可能になりました。

今回のエントリーでは、実際にコマンドを送受信する機能を紹介しました。
今後は、今回紹介した通信機能を用いて、Ev3で組み立てた車を制御していく仕組みを紹介します。

2017/07/15 追記
今エントリーのソースコード一式を公開しました。
ココからダウンロードできます。

関連記事

no image

C言語でEV3開発(15)-TOPPERS/HRP2 EV3 で PID制御

どもです。 今回のエントリーは、コレまでのエントリーから内容を変えて、モーターの動作の制御をします

記事を読む

no image

Objective-CからC++コードを呼び出す

どもどもです。 今回は、突然ながらMacに関係する投稿です。 ソフト関係のことを勉強していて

記事を読む

MindStormControl_SprachScreen

EV3開発サポートツール(2)-C#のユーザーコントロール開発(2つ目)

どもです。 前回に引き続き、今回もC#/WPFでの独自UI(ユーザーコントロール)の作成についての

記事を読む

eclipse_4.3_kepler

eclipse/CDTにおけるgdbでのデバッグ中に発生するpythonのエラー

どもです。 今回のエントリーは、Eclipse上でのデバッグの際に「pythonのエンコードエラー

記事を読む

toppers

C言語でEV3開発(16)-TOPPERS/HRP2 EV3 で Bluetooth割込み

どもです。 今回は、EV3 の環境をTOPPERS/HRP2 EV3RT で作成したアプリをPC上

記事を読む

toppers

C言語でEV3開発(22)-ロギング機能

どもです。 前回は、モーターの出力を制御する方法について記載しました。その際に、モータ/車体が期待

記事を読む

toppers

C言語でEV3開発(18)-モードの遷移の設計-コマンド通信処理の準備

 どもです。  今回は、前回紹介したEv3とBluetoothで通信する機能を

記事を読む

no image

C言語でEV3開発(7)

どもです。 今回のエントリーでは、いよいよEV3を動かしていきます。 新しい環境に対して、最もよ

記事を読む

eclipse_4.3_kepler

elicpse/CDTでのgdbでのソースを追従したデバッグができない問題

どもです。 今回のエントリーは、Eclipse上でgdbを利用したデバッグ中に発生する問題について

記事を読む

no image

C言語でEV3開発(8)-opOUTPUT_POWERコマンド

どもです。 今回のエントリーでは、EV3でモーターを動かします。 なお、今回のエントリーでも

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

PAGE TOP ↑