1

シリアルポート経由でデータを送信しています..送信部分は問題ありません。相手側でデータを取得していますが、確認部分を完了できません...これが私がやっていることです...

mySerialPort.Open();
        mySerialPort.Write(databuffer, 0, 19);
        System.Threading.Thread.Sleep(2000);
        if (mySerialPort.BytesToRead > 0)      // this condition not working
        {
            string rdata = mySerialPort.ReadExisting();
            if (rdata.ToUpper().Trim() == "OK")
            {
                lblmsg.Text = "OK";
            }
            else
            {
                lblmsg.Text = "FL";
            }
        }

        mySerialPort.Close();

さらに私のシリアルポートの設定はこんな感じ…。

public void SettingRS232(string port)
    {
        try
        {
            SerialPort mySerialPort = new SerialPort(port);
            mySerialPort.PortName = port;
            mySerialPort.BaudRate = 9600;
            mySerialPort.Parity = Parity.None;
            mySerialPort.StopBits = StopBits.One;
            mySerialPort.DataBits = 8;
            mySerialPort.Handshake = Handshake.None;
            mySerialPort.ReadTimeout = 2000;
            mySerialPort.WriteTimeout = 500;

            mySerialPort.DtrEnable = true;
            mySerialPort.RtsEnable = true;
        }
        catch (Exception ex)
        {
            lblmsg.Text = ex.Message;
        }
    }
4

2 に答える 2

1

シリアルポートのDataReceivedイベントにフックする必要があります。あなたが始めるためにそこにたくさんの良いリソースがあります。基本的に、イベントハンドラーを接続し、イベントハンドラー内で、データがある限りポートから読み取ります(BytesToRead> 0)

于 2012-09-25T11:20:40.307 に答える
1

それはほとんどありません。まず、HyperTerminal や Putty などの別のプログラムを使用して接続をテストします。これにより、基本が正しく、電気接続が適切で、ボーレート、パリティ、ストップビット、およびデータビットの設定が正しいことを確認できます。そして、選択したマジック ナンバーの 2 秒以内にデバイスが応答を返すことを確認します。

最も一般的な間違いは、適切なハンドシェイクを処理していないことです。None のままにしておくと、ハンドシェイク信号を自分でオンにする必要があります。RtsEnable および DtrEnable プロパティを true に設定します。デバイスは、これらの信号がオフになっていることを確認しても何も送信しません。電源が入っておらず (DTR)、データを受信する準備ができていない (RTS) と見なします。

バイナリ データと文字列を混在させないようにしてコードをさらに改善し、ひどい Sleep() を取り除きます。Read() メソッドを呼び出してバイトを受け取り、戻り値に注意して取得した数を確認します。受け取るはずだったものをすべて取得するまで、Read() を呼び出し続けます。


編集: SettingRS232() メソッドにバグがあります:

 SerialPort mySerialPort = new SerialPort(port);

これにより、mySerialPort という名前のローカル変数が作成されます。コードの残りの部分が使用している mySerialPort 変数ではなく、そのローカル変数を初期化しています。次のように記述してバグを修正します。

 mySerialPort = new SerialPort(port);
于 2012-09-25T11:27:50.127 に答える