Windows 8.1 ストアアプリからWinUSBを通じて.NET Gadgeteerと連携する

最近、Windows 8.1 の周辺機器連携に関する記事を書いていますが、今回は、UsbDeviceクラスを使って、.NET Gadgeteerとシリアル通信する方法を紹介します。

使った製品は、

  • ELECOM製、UC-SGT(RS232C USB変換ケーブル)
  • FEZ Spider (.NET Micro Frameworkが動くARM7ボード)
  • FEZシリーズのRS232Cボード
  • FEZシリーズの加速度センサーなど

です。手元にあったものを使ってみました。

以前もこのブログで紹介していますが、ELECOM製UC-SGTケーブルは、ELECOMさんからWinUSBクラスで認識するためのソフトウェアを、

https://www2.elecom.co.jp/search/link/search.asp?group=/cable/usb/uc-s/gt/&link_type=3

から、公開していただいているので、予め、Windows 8.1 PCにこのソフトウェアを当てておきます。

写真の様に、UC-SGTケーブルと、FEZ SpiderのRS232Cボードを、RS232Cヌルモデムケーブル経由でつなぎます。

これで、UC-SGTケーブルをWindows 8.1 PCのUSBポートにつなげば、ストアアプリとFEZ Spiderボードの間でシリアル通信ができます。この時、UC-SGTケーブルを介してつながったデバイスは、Communication Device Classで接続されます。

FEZ Spider側は、

こんな風にボードをつなぎます。左下のボードがRS232Cボードです。送受信プログラムは、Program クラスの ProgramStartedメソッドで、以下の初期設定コードを追加

            rs232.Initialize();
            rs232.serialPort.DataReceived += serialPort_DataReceived;

します。DataReceivedイベントに登録しているハンドラは、

        void serialPort_DataReceived(GT.Interfaces.Serial sender, System.IO.Ports.SerialData data)
        {
            int bytes = rs232.serialPort.BytesToRead;
            byte[] buffer = new byte[bytes];
            rs232.serialPort.Read(buffer, 0, buffer.Length);

            string received = "";
            foreach (var b in buffer)
            {
                received += (char)b;
            }
            Debug.Print("Received : " + received);

            if (received == "accelerometer")
            {
                var current = accelerometer.RequestMeasurement();
                string sendContent = "Accelerometer : X=" + current.X + ",Y=" + current.Y + ",Z=" + current.Z;
                rs232.serialPort.Write(sendContent);
            }
        }

と、ストアアプリから送信されるデータの受信と受信データのデバッグ表示、受信したデータが、"accelerometer"という文字列なら、加速度センサーの値をストアアプリに送り返す、というコードを用意しました。

rs232のInitialize()メソッドをコールすると、ボーレート:38400、パリティ無、ストップビット1、データビット8、ハードウェアフローコントロール無で、RS232ボードが初期化されています。

FEZ SpiderボードをPCにUSB接続し、Visual Studio 2012でこのアプリを配置&実行します。

さて、ストアアプリ側ですが、基本的には他の周辺機器連携と同様に、DeviceInformationのFindAllAsync()メソッドで、つながっているWinUSBデバイスを検索、Windows.Devices.Usb.UsbDeviceクラスで接続(FromIdAsync()メソッド)、DataWriter、DataReaderでデータ送受信、という流れの制御になります。ただし、このケースでは、通信しあう前に、シリアル通信のボーレートやパリティ、ストップビットなどの設定が必要です。結構複雑なので、ここでの詳しいコードの説明はやめます。

ストア側のコードは、

https://code.msdn.microsoft.com/windowsapps/USB-CDC-Control-sample-5ba19caa

から公開されているサンプルコードに丸ごと入っているので、このブログの他のポストも参考にしながら、コードを追ってみてください。

このサンプルをダウンロードして、実行すればすぐにFEZ Spiderボードと通信可能です。以下の手順を試してみてください。

シナリオ1で、デバイスを選択し、ボーレートなどをFEZ Spider側のrs232に合わせて初期化する

シナリオ3で、適当なテキストを入力し送信→FEZ Spider側で受信

シナリオ3で、accelerometer とテキストを入力し送信→FEZ Spider側で受信し、加速度センサーの計測値をストアアプリに送信

シナリオ2で、受信。送られた計測値が表示される

最後になりましたが、Package.appxmanifestをコード表示して、UC-SGTケーブルにアクセスできるように、以下のCapabilityを追加してから実行してください。

  <Capabilities>
    <m2:DeviceCapability Name="usb">
      <m2:Device Id="vidpid:056E 5004">
        <m2:Function Type="classId:ff * *"/>
      </m2:Device>
    </m2:DeviceCapability>
  </Capabilities>

太字で示した部分が、UC-SGTに関する情報です。