8

Windows 7 x64のシリアルポートCOM1に接続されたIRレシーバーでWinLIRCを使用しています。WinLIRCはスタートアップ フォルダ ([スタート] -> [すべてのアプリケーション] -> [スタートアップ]) に追加されるため、ログインするたびに開始されます。非常に頻繁に (常にではありませんが) からWinLIRCの初期化エラー メッセージが表示され、しばらくの間 (数分間) 続きます。初期化を再試行すると、何回か再試行した後、正しく初期化され、正常に動作します。スタートアップから削除して手動で起動すると、エラーなしで起動します。

ソースをダウンロードし、あちこちに呼び出しWinLIRCを追加MessageBoxしたので、初期化中に何が起こるかを確認でき、CreateFile呼び出しが失敗することがわかりました。

if((hPort=CreateFile(
    settings.port,GENERIC_READ | GENERIC_WRITE,
    0,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0))==INVALID_HANDLE_VALUE)
{
    char buffer[256];
    sprintf_s(buffer, "CreateFile(%s) failed with %d", settings.port, GetLastError());
    MessageBox(NULL, buffer, "debug", MB_OK);
    hPort=NULL;
    return false;
}

「CreateFile(COM1) failed with 5」というメッセージ ボックスが表示されます。このリンクによると、5 は「アクセスが拒否されました」エラーのエラー コードです。

問題は、Windows の起動直後に COM ポートを開くと、このようなエラーで失敗し、数秒または数分後に正常に進むことができるのはなぜですか?

更新:COMポートは本物です。

Update2 : 以前にシリアルポートを開く他のアプリケーションについてWinLIRC。私は次のことを行いました: Process Explorerを Startup フォルダーに配置して、ログイン時にも起動し、再起動しました。プロセス エクスプローラーが起動するとすぐに、[ハンドルまたは Dll の検索] ダイアログを実行し、入力に「Serial0」を入力して [検索] をクリックしました。その時点で、WinLIRC は既に「CreateFile(COM1) failed with 5」というメッセージ ボックスを表示していました。次に、プロセス エクスプローラーの検索が終了するまで待って、何も見つからないことを確認してから、WinLIRC の再初期化を試みましたが、再び失敗しました。したがって、シリアルポートが他のアプリケーションによって開かれている場合ではないことをお勧めします。誰かがそれを確認するためのより良い方法を提案できる場合は、喜んで再確認します.

WinLIRCの実行中にプロセスエクスプローラーで「Serial0」を検索すると、winlirc.exeプロセスが見つかったので、検索するのに正しい用語のようです。

Update3 : シリアルマウスドライバーについて。デバイス マネージャーに表示されていないため、そこで無効にすることはできませんでしたが、サービスを無効にする方法に関するこのsermouse手順を見つけましたが、役に立ちませんでした。

Update4 : もう 1 つ言い忘れました。PCを起動してすぐにログインした場合にのみ発生します。Windows をログイン画面で数分間放置し、後でログインすると、WinLIRC は常に問題なく初期化されます。

Update5 : 残念ながら、この問題が再現されたコンピューターにアクセスできないため、これ以上実験することはできません。

4

2 に答える 2

1

Windows でのシリアル プログラミングの魔法の世界に飛び込む前に、いくつかのリンクを参照してください :)

Windows でのシリアル プログラミングの詳細な説明:

http://www.codeguru.com/cpp/in/network/serialcommunications/article.php/c5425/Serial-Communication-in-Windows.htm

少し時代遅れです (サイトには 1999 年から 2003 年と記載されているので、時代遅れです) が、絶対に役に立ちます。

http://www.flounder.com/serial.htm

于 2013-06-24T08:22:08.860 に答える
1

ポートの初期化には時間がかかります。あなたのアプリケーションは、Windows XP 上で問題なく動作します。Windows7 のシリアル ポートは仮想です。

小さなコードを実行し、System.IO.Ports を使用してチェックアウトできます。

    private void Form1_Load(object sender, EventArgs e)
    {

        string[] ports = System.IO.Ports.SerialPort.GetPortNames();
        comboBox1.Items.Add("None");
        foreach (string port in ports)
            comboBox1.Items.Add(port);
        comboBox1.SelectedIndex = 0;

    }

これにより、シリアルポートのリストが返されます。ステータスを確認し、メッセージ ボックスに表示します。このコードを作成し、起動時に実行します。根本原因がわかります。

于 2013-06-23T07:59:42.440 に答える