Windows API を使用してヌル文字をシリアル ポートに送信するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/387322

  •  23-08-2019
  •  | 
  •  

質問

私は、標準の COM ポートを使用してカスタム ハードウェアと通信する Windows ユーティリティ プログラムに取り組んでいます。通信プロトコル (これは私の制御の外です) では、生の 8 ビット データ バイトを送受信する必要があります。

現在、次の Windows API 関数を使用してデータを COM ポートに送信しています。

WriteFile(hFile, lpBuffer, numberOfBytesToWrite, ...)

どこ hFile 適切に開かれた COM ポートへの参照であり、 lpBuffer はメモリに保存したバイトの配列です。このコードは、ヌル文字 (ASCII ゼロ) をデバイスに送信する必要があるまでは完全に機能します。 WriteFile は、null 文字が文字列の終わりに達したと想定するため、null 文字を検出するとすぐに送信を停止します。設定してもこうなる numberOfBytesToWrite きちんと。

Windows API を使用して生データを COM ポートに送信するにはどうすればよいですか?次のような標準 API 呼び出しを使用したいと考えています。 WriteFile, 、しかし、提案は歓迎です。

現在使用しています ラピッドQ ユーティリティを構築しますが、行うことは Windows API 関数を直接呼び出すことだけです。

編集: 私のセットアップは、シリアル ポート経由でカスタム ハードウェア モジュールに接続された Windows PC で構成されています。モジュールには小さな画面があり、送信された文字を表示できます。この設定を別のサードパーティ製ユーティリティ プログラムでテストしました。このサードパーティプログラムを使用してモジュールと通信でき、null 文字も正しく表示されます。私自身のプログラムで使用するとき、 WriteFile, 、送信ストリーム内のどこかにヌル文字があると、ストリームの残りの部分の送信が停止されます。

役に立ちましたか?

解決

私は以前に Windows シリアル ポート プログラミングを行ったことがあり、シリアル ポート経由で null 文字を送信できたことを確信しています (そうでなければ、さまざまなファイル転送プロトコルは機能しませんでした)。考えられる説明は 2 つあります。

  1. 受信 デバイスは、最初のヌル文字で停止するメソッドを使用して、受信したデータを出力しています。送信デバイスが最初のヌルで終了していることをどのように判断しますか?問題はさらに先のどこかにある可能性がありますか?
  2. シリアルドライバーが壊れています。これはかなりありそうにありませんが、考えられる説明です。怪しい独自のサードパーティ製シリアル ポートとそのドライバを使用している場合は、それらが疑わしい可能性があります。通常の Windows ドライバーで標準の組み込みシリアル ポートを使用している場合、これはおそらく問題ありません。

RapidQ をざっと見たところ、考えられる 3 番目の説明があります。

  1. RapidQ が Win32 API 関数を呼び出すプロセスで実行するマーシャリングでは、送信するデータに埋め込まれた null 文字によって問題が発生する可能性があります。RapidQ については何も知りませんが、これも考慮する必要があるチェーン内のもう 1 つのリンクです。

他のヒント

グレッグはおそらく正しいですが、私はまた、あなたのCOMポート設定を確認します。あなたのDCB設定が正しく設定されていることを確認します。情報のためのSetCommState、およびGetCommStateを見上げてます。

通常、など、シリアルは8N1ですが、お使いのデバイスは、いくつかの他のパリティを使用して、またはビット構成を停止することがあります。

グレッグのように、私はシリアルの上に自分自身を多くの作業を行ってきた、これは多くの場合、問題の原因となる可能性が... RS485、誤ったDCB構造と話をしてみ...あわや..

ラリー

PS:まだお持ちでない場合は、私は自分自身に良いシリアルブレイクアウトボックスを取得してお勧めします。私は家の周りのどこかに1を持っている、そしてそれは、すべての信号が何であるかを紹介します、あなたのコミュニケーションのすべての中にすべての行に、そして非常に強力なデバッグツールです。

私は過去にWriteFile関数を使用している、それがNULLバイトでうまくいきました。私はそれが問題になる可能性がある、RapidQに掘るます。

これのどれも助けていない場合は、

、あなたはいつも私が何を行うことができます。で、デバイスをテストするためにグレッグのCOMMコードを使用してください。 Qmodemを覚えていますか?テスト/デバッグシリアルルーチン用:)非常に便利なツール。あなたも、別の箱(または同じボックス内の別のポート)上のCOMポートを読んで、送信されるすべての文字の進値をプリントアウトするQmodemとシンプルなQmodemスクリプトを使用ccould。あ、待って。 Qmodemがあることが組み込まれています。:)デバッグASCIIエミュレーションを使用して、シリアルポートに出くわすあらゆる文字の進値が表示されます。その後、あなたは少なくとも、あなたのコードが正しく動作するかしないかどうかを確認できます。

さて、質問。それはNULLに当たったときのWriteFileは返さない、またはそれだけで座っていないと待って、そして決して返しませんか?

それは決して戻らない場合は、

、それはあなたのコードではないかもしれません。それはすべてのdwBytesToWriteを送信したときのWriteFileは返すのみ、またはエラーが発生した場合。何か他のもの、書き込みしようとしているが、もう一方の端の障害があります。

scroll top