スキップしてメイン コンテンツへ

 none
仮想COMポートについて RRS feed

  • 質問

  • はじめまして、初投稿させていただきます。

    ■仮想COMポートについて
    WInDDK7.6 の VirtualSerial をビルド・インストールし COM3 として登録できました。

    COM3に対してハイパーターミナルから送ったデータを自作アプリケーションで
    データを読むといったものを作っています。

    自作の受信アプリは マイクロソフトのサイトの 
      [VC++ Native] 仮想 COM ポート アクセス
    を参考にしています。

    ■問題
    2バイトに1回しか受信できません。

    例)
    送信データ 0x30 0x31 0x32 0x33 の場合
    受信データ 0x31 0x33 となってしまいます。
     
    仮想COMではなく、実際に232Cで接続したPCと通信させたところ、問題はなかったため 
    仮想COMドライバが原因だと思っています。


    ■質問
    仮想COMドライバがUNICODE になっているのが原因かと想像しているのですが、
    対処方法がよくわかりません。

    (/D_UNICODE /DUNICODE をはずすと、ビルドエラーになります。)

    そもそも UNICODEが原因なのか?ほかに原因があるのでしょうか?

    以上 よろしくお願いします。

    • 移動 Mike Wang (MSCS) 2012年10月2日 12:57 (移動元:Windows デバイスドライバー開発)
    2012年4月2日 8:41

回答

  • WinDDK7.6 じゃなくて Windows Driver Kit (WDK) Version 7.1.0 ですよね?

    付属ドキュメント(virtualserial.htm)に以下のように記載されています。
    This sample demonstrates a simple virtual serial driver. This driver supports sending and receiving AT commands using the ReadFile/WriteFile calls or via a TAPI interface using an application such as HyperTerminal.

    This sample driver is a minimal driver meant to demonstrate the usage of the User-Mode Driver Framework. It is not intended for use in a production environment.

    tk-tisawaさんの作成したプログラムが
    1)ハイパーターミナルと同様のアクセス方法であれば、同じように動作するはずです。
    2)ハイパーターミナルと異なるアクセス方法で動作させたい場合は、VirtualSerialサンプルドライバの改修が必要です。

    VirtualSerialサンプルドライバの付属ドキュメントと、ソースコードをよくお読みになることをお勧めします。

     

    • 回答としてマーク tk-tisawa 2012年4月5日 2:37
    • 回答としてマークされていない tk-tisawa 2012年4月5日 2:38
    • 回答としてマーク tk-tisawa 2012年4月5日 2:42
    2012年4月5日 0:22

すべての返信

  • どのようなデバイスドライバーを開発されているのでしょうか? 質問を読む限りデバイスドライバーにアクセスする通常のアプリケーションに関する質問のように読み取れますが。

    参照されたサイトへリンクを貼った方が親切かと。

    さて、[VC++ Native] 仮想 COM ポート アクセスですが、コードが酷いです。

    // 指定ポートを開く 
    LPCSTR portName = "\\\\.\\COM1"; 
    HANDLE myHComPort = CreateFile( 
            (LPCTSTR)portName, 
            GENERIC_READ|GENERIC_WRITE, 
            0, NULL, OPEN_EXISTING, 0, NULL); 

    LPCSTRをLPCTSTRにキャストしていますが、このような行為はすべきではなく、サンプルにあるまじきコードです。他のコードを参考にすることをお勧めします。

    2012年4月2日 9:24
  • 返信ありがとうございます。
    説明不足すみません。
    WinDDK7.6 のサンプルソースの中に VirtualSerial というのがあります。
    これは「仮想COMポートを追加できるドライバ(仮想COMドライバ)である」という理解をしています。
    これをビルド インストールしました。(ソースはそのままで、一部infファイルを書き換えました。)

    ■現在行いたいことは 下記のようなことです。
    ・仮想COMポートに対し、 ハイパーターミナルからデータを送ります。
    ・仮想COMドライバ内では ハイパーターミナルから送られたデータをリングバッファに入れます。(多分)
    ・自作アプリケーションでは 仮想COMドライバのリングバッファのデータを読みたいので仮想ポートに対し CreateFile / ReadFile を行っています。

    ■問題が アプリケーション側/仮想COMドライバ側 のどちらにあるのかつかみかねています。
    が、仮想COMポートではなく232CケーブルでPCをつないだ場合は問題なかったため、(ハイパーターミナルと自作アプリケーションを別PCとして試しました)
    アプリケーション側はとりあえず問題ないという認識でいます。

    以上 よろしくお願いします。


    2012年4月2日 9:59
  • WinDDK7.6 じゃなくて Windows Driver Kit (WDK) Version 7.1.0 ですよね?

    付属ドキュメント(virtualserial.htm)に以下のように記載されています。
    This sample demonstrates a simple virtual serial driver. This driver supports sending and receiving AT commands using the ReadFile/WriteFile calls or via a TAPI interface using an application such as HyperTerminal.

    This sample driver is a minimal driver meant to demonstrate the usage of the User-Mode Driver Framework. It is not intended for use in a production environment.

    tk-tisawaさんの作成したプログラムが
    1)ハイパーターミナルと同様のアクセス方法であれば、同じように動作するはずです。
    2)ハイパーターミナルと異なるアクセス方法で動作させたい場合は、VirtualSerialサンプルドライバの改修が必要です。

    VirtualSerialサンプルドライバの付属ドキュメントと、ソースコードをよくお読みになることをお勧めします。

     

    • 回答としてマーク tk-tisawa 2012年4月5日 2:37
    • 回答としてマークされていない tk-tisawa 2012年4月5日 2:38
    • 回答としてマーク tk-tisawa 2012年4月5日 2:42
    2012年4月5日 0:22
  • 返信ありがとうございます。

    >VirtualSerialサンプルドライバの付属ドキュメントと、ソースコードをよくお読みになることをお勧めします。

    確かにそうですね もう少し勉強してから出直します。

    2012年4月5日 2:42
  • ご質問の中に記載されていたサイトのサンプル コードをチラッと眺めたのですが、ReadFile() でのバッファサイズが 1024 バイトの固定になっているのが気になります。
    シリアル ポートから ReadFile() API でデータを読み取る際には、事前に ClearCommError() API でポートの状態を確認して、エラーでなかったら COMSTAT 構造体 cbInQue メンバにセットされているサイズ分を ReadFile() で読み出す。。。という手順が必要なのでは?

    COMSTAT 構造体 cbInQue メンバの説明には以下のように記載されています。

    ------------------------------------------
    COMSTAT
    http://msdn.microsoft.com/en-us/library/aa909224.aspx

    cbInQue
    Specifies the number of bytes received by the serial provider, but not yet read by ReadFile.
    ------------------------------------------
    ClearCommError
    http://msdn.microsoft.com/ja-jp/library/cc429181.aspx
    ------------------------------------------

    2012年4月5日 4:27
  • 返信ありがとうございます。
    ・TANO_ASOさんのアドバイスどおり、ドキュメントを読んでいたら
    まず[自分が期待している機能]と[サンプルプログラム]が異なることがわかりました。
    ・サンプログラムに対して 「AT」 コマンドをハイパーターミナルで送信すると
    「OK」が帰ってきましたので、サンプルプログラム自体の動作は一応問題ないことがわりました。
    ・自分が作りたい機能に対しては修正が必須であることまで理解できました。

    *作りたい機能
    ハイパーターミナルなどから送られたデータ(ドライバ内に保持されたデータ)をアプリケーションから読出す

    指摘していただいた内容 参考にさせていただきます。


    2012年4月5日 5:05