-1

すべてのデータがシリアルポートに送信されるまで待つにはどうすればよいですか

この条件をテストするには、次のコードを想定します。

            Console.WriteLine("Baud is:" + SerialPortObj.BaudRate);
            Console.WriteLine(DateTime.Now.Millisecond);
            string tmpStr="";
            for (int i = 0; i < 100; i++)
            {
                tmpStr += "A";
            }
            SerialPortObj.Write(tmpStr.ToCharArray(),0,99);
            Console.WriteLine(DateTime.Now.Millisecond);

出力例は次のとおりです。

ボーは:300

97

97

そして、.Net がすべての文字が送信されるまで待機していないことを示しています!

以下のコードは機能しません。

            Console.WriteLine("Baud is:" + SerialPortObj.BaudRate);
            Console.WriteLine(DateTime.Now.Millisecond);
            string tmpStr="";
            for (int i = 0; i < 100; i++)
            {
                tmpStr += "A";
            }
            SerialPortObj.Write(tmpStr.ToCharArray(),0,99);

            while (SerialPortObj.BytesToWrite>0)
            {
                Thread.Sleep(1);
                Console.WriteLine(SerialPortObj.BytesToWrite);
            };

            Console.WriteLine(DateTime.Now.Millisecond);

出力例は次のとおりです。

ボーは:300

97

97


私は、ボーレートの変更に依存する特別なプロトコルに取り組んでおり、次のようなものを使用しています:

       ->[Send Some Bytes (Baud300)] 

       <-[Receive Another Bytes (Baud9600)]

だから私は書き込みメソッドでいくつかの文字を送信し、それが終了するまで待ち、終了直後にボーを変更しようとするので、受信したバイトを理解することができました


何か考えはありますか?

4

3 に答える 3

2

そもそもシリアルポートはステートレスです。そのため、ボーレートの変更がいつ適切な時点に達したかを確実に知ることはできません。独自の特別なプロトコルを実装するため、通信の両側 (送信側/受信側) を制御する必要があります。Handshakeその場合は、プロパティをに設定し、プロパティをRequestToSend確認することを強くお勧めしDtrEnableます。

また、独自のタスク/スレッドによって監視される通信の各サイトで 2 つのバッファー (受信/送信) を使用する必要があります。送信バッファに何かをプッシュすると、タスクは送信が可能かどうかをチェックし ( CtsHolding, DsrHolding)、可能であればボーレートを変更して、そのデータをワイヤにプッシュします。保持プロパティが元に戻るまで待ってから、ボーレートを別の値に変更します。この場合、着信スレッドは非常に単純です。DataReceivedボーレートの変更が発信タスクによって行われるイベントを待つだけです。

ハードウェア ハンドシェイクを使用する場合 (あなたのケースではこれを強くお勧めします)、シリアル ポートがそれを正しくサポートしていることを確認してください。ほとんどの USB-to-Serial-Adapter は、19200-8-N-1 以外ではうまく機能しません。したがって、正しくコーディングしていない、またはクラスにバグがあると考える前に、実際のシリアル ポートSerialPortを備えた 2 台のマシン (またはテスト用に 2 つのポートを備えた 1 台のマシン) を見つけてみてください。

于 2012-08-27T11:13:07.320 に答える
0

ハードウェアでそれを行いますか?

300/9600 として構成された 2 つのシリアル アダプターを使用しようとする場合があります。1 つは Tx、もう 1 つは rx です。ピン2/3が異なるDタイプに分割された「面白いケーブル」が必要になりますが、それはうまくいくはずです。

于 2012-08-27T12:27:18.413 に答える
0

データを変数に保存し、特定の条件が発生した場合 (ユーザーが設定できます)、変数の値をシリアル ポートに送信します。

于 2012-08-27T07:52:46.327 に答える