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に関する情報です。
Comments
Anonymous
January 05, 2014
大変参考になりました。ありがとうございます。 Windows8.1(64ビット)のストアアプリでシリアル通信を行いたいと思い上記手順を参考に、 UC-SGT(末尾EA)を使用しサンプルプログラムから認識させようと試みましたのですが 上記のようには上手く動作させられませんでした。 UC-SGTの開発者向けinfファイルをインストールしてサンプルを実行させたところ UsbDeviceのCompleteイベント内で引数(サンプルでの変数名はop)からGetResults関数にてNULLが 返ってきてしまいUsbDeviceを生成できませんでした。 何か問題になるような箇所がお分かりになるようでしたらお教え願えればと思います。 よろしくお願いいたします。Anonymous
January 06, 2014
先日質問させて頂きましたものです。 いろいろ調べても分からなかったのですが接続しているUSBポートを 違うポートにしてみたらUsbDeviceを生成することが出来ました。 取得したDeviceInfomationでのデバイス名が接続するするポートで違っていたので 使用しているPC固有の問題だと思います。 板汚し申し訳ございませんでした。