EV3RTを使ってみる(8.5)

Toppers/EV3RTを使ってプログラムを作成したときの記事です。
この記事を書いた時のEV3RTのバージョンはβ4です。
目次はこちら

前回の記事でBluetooth経由で通信を行うプログラムを紹介しましたが、EV3RTでは少し違った書き方もできます。前回紹介したプログラムでは関数「ev3_serial_open_file」でファイルポインタを作成して、このファイルポインタを指定することでデータの送受信を行いました。今回紹介するプログラムでは、デバイスに対してデータの送受信を行うと思われる 1関数「serial_rea_dat」と「serial_wri_dat」を使います。

前回紹介したファイルポインタを指定する方式と比べて、今回紹介する「serial_rea_dat」「serial_wri_dat」を使う方式は少し書き方が異なります。まず、ファイルポインタを作成する必要がありません。前準備なしで「serial_rea_dat」や「serial_wri_dat」を呼び出しても問題ありません。また、Bluetooth通信が開始されていない状態で受信関数「serial_rea_dat」を呼び出した場合、Bluetooth経由でデータを受信するまで処理をブロックします。つまり、プログラムによっては「ev3_bluetooth_is_connected」を使ってBluetoothの接続状態を確認する必要はありません。

さて、前回と同じ動作を行うプログラムを「serial_rea_dat」と「serial_wri_dat」を使って作っていきます。

設定ファイル「app.cfg」とヘッダファイル「app.h」は前回と同じです。

INCLUDE("app_common.cfg");

#include "app.h"

DOMAIN(TDOM_APP) {
  CRE_TSK(TASK1, { TA_ACT, 0, task1, TMIN_APP_TPRI + 1, STACK_SIZE, NULL });
}

ATT_MOD("app.o");
void task1(intptr_t exinf);
void display();

ソースファイル「app.c」ではBluetooth通信を行うために関数「serial_rea_dat」と「serial_wri_dat」を呼び出しています。また、これらの関数を使うためにヘッダファイル「syssvc/serial.h」を読み込んでいます。このプログラムでは接続状態を確認する必要がないため「ev3_bluetooth_is_connected」は使っていません。

#include "ev3api.h"
#include "app.h"
#include <syssvc/serial.h>

#define MESSAGE_LEN  8

static char message[MESSAGE_LEN + 1] = {0};

/* タスク */
void task1(intptr_t exinf)
{
  display();

  while(1){
    int size = serial_rea_dat(SIO_PORT_BT, message, MESSAGE_LEN);
    
    if(size > 0){
      serial_wri_dat(SIO_PORT_BT, message, size);
    }

    display();
  }
}

/* 状態を表示する。 */
void display()
{
  ev3_lcd_set_font(EV3_FONT_SMALL);
  ev3_lcd_draw_string("Program is running", 10, 30);
  ev3_lcd_set_font(EV3_FONT_MEDIUM);
  ev3_lcd_draw_string(message, 10, 40);
}

さて、2通りのBluetooth通信プログラムが作成できるわけですが、どちらが良いかは場合によるかと思います。もし、Bluetooth通信を行うだけであれば今回紹介した方式の方がシンプルなプログラムになりそうです。一方、Bluetooth通信とファイル操作が関係している場合は、前回のファイルポインタを使う方式だと処理を共通化できるかもしれません。

とりあえず、「EV3RTを使ってみる」の記事はここまでにしたいと思います。また、何かテクニックみたいなものを見つけたら記事にするかもしれません。あと、現在のEV3RTのバージョンはβ4ですのでリリース版になったときに仕様が変更されるかもしれません。この記事を参考にされる場合はバージョンの違いには注意してください。

Notes:

  1. EV3RTのソースコードは読んでいませんので、これらの関数の正確な動作はわかりません