スパイス  組み込み制御装置の受注製作

USBから複数シリアルポートを
平成26年 8月 14日

 複数シリアルポートでの動作を確認
 極めて限定的な条件下ですが、2ポートのシリアルポートを動かすことが出来ました。実験段階のため通信仕様などの細部まで検証し切れていないのですが、基本的な動作は確認できたと思います。その前に以前書いた内容に訂正が必要です。

 以前の記述の訂正
H26年6月14日付けの説明で、2ポートのシリアルポート接続の認識に成功したと書いたのですが、その後当時のバックアップを元に同じ操作をしても同じ結果を再現できません。下記のように1ポートはシリアルポートとして認識されるのですが、もう一方は不明なデバイスとして扱われます。何回かに一度は以前の状態になることもありましたが、これでは使い物になりません。原因は良く分かりませんが、WinXPでは上手く動作しないようなので、これ以上の原因追究は諦めました。


    複数シリアルポートの認識
 上記のように一度は上手く行ったと思った複数シリアルポートの認識からやり直しです。
実際には、先にシリアルポートを複数ポートに出来るようにCDCプログラムを中心としたプログラムの変更をしていたのですが、説明するには先に複数ポートの認識に成功する手順の方がわかり易くなります。先日紹介したHPの多くをはじめネットからも多くの情報を得ました。先人たちの努力には感謝です。それらを前提にして試行錯誤した結果、以下のような結論を得ました。

  OSがWinXPでは複数シリアルポートを正しく認識させることは出来ず、Win7に変更すると期待通りに認識されました。



"USB Serial Port"としてCOM3・COM4の2ポートが認識されています。この状態で、2ポートに拡張したプログラムを動作させた結果が下記です。TeraTermによってCOM3とCOM4それぞれに通信出来ています。画像クリックで拡大表示します。



 実験にはここまでWinXPを使用してきたのですが、どうも動作が安定しないためWin7で試したところ上手くいきました。OS側でUSBをどのように扱っているのかは分からないのですが、USB仕様自体が後から複合機能に関する詳細仕様を追加してきた経緯からも、OSの内部的な扱いに複合機能を扱うには不都合な部分が残っている可能性はありそうです。今後はWinXPを使用する場面は減少していきますので、Win7以降を対象としても大きな不都合はなさそうです。この結果からある程度汎用的な(CPU依存部分を分離した)USBプログラムを書いてみたい。

 しかし、組み込み装置主体の人間では、今回のようにPCが絡む部分の動作検証は本当に骨が折れる。 当初はネットの情報を主体にしてやっていたがどうにもならず、最終的にはUSBの仕様書(英語)まで目を通す羽目になってしまった。それでも細部の仕様や実装に関して幾つかの疑問が残ります。

    マイクロチップ社のUSBフレームワークについて
 使用したバージョンはv2013_12_20です。このプログラムはサンプルであるという意味からPIC18/24F/32と3種類のCPUをサポートしています。CPUの構成は各々全く異なるため、プログラム中には多くの#ifdef文による条件コンパイルがあり、正直なところ非常に読みにくい状態です。最終的に製品に組み込むことを前提にするなら、プログラムを書き直す方が安全です。また、プログラム自体も機能を追加している途中のようで現時点では不要と思われる変数も多く見られます。
 ざっと気になった点を書いてみると
 ・ピンポンバッファを使用する設定でも二つあるバッファの片方のみが有効であり、受信割り込み処理の中で他方を有効にしているため、本来の意味でのデュアルバッファにはなっていない(両方のバッファが同時に有効にはならない)。CPUが他の処理に時間をとられてUSBの受信割り込みに対応できない状況では、二つあるバッファの両方が使用できない(片方のバッファには有効なデータが無いにもかかわらず)。
 ・CDC機能の実装では、EP0以外のUSB送受信は事実上ポーリングによるデータ転送となっており、割り込み駆動でないため、CPUの処理状態によってUSBの通信に影響を受ける。
 ・変数の命名規則が良く分からない。特にグローバル変数に関しては一貫性のある命名規則に従っていないと、他のモジュールとの変数の衝突を心配しないといけない。
といった点が気になります。


目次へ  前へ  次へ