1

シリアルからの出力を使用して実験用のテキスト ファイルに書き込み、シリアル ポート コマンドを使用してデバイスを継続的にトリガーしようとしています。read() 関数をテストするために使用しているサンプル コードを次に示します。これらの関数はすべて異なる動作をし、その理由を理解できません。

bytestoread プロパティを使用して、シリアルの出力をチェックし続けてテキスト ファイルに書き込めるようにしたいと考えています。

class Program
{
    static void Main(string[] args)
    {

        byte[] buffer = new byte[2048];
        SerialPort port = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);
        port.Open();
        port.DtrEnable = true;
        port.RtsEnable = true;
        port.NewLine = "\r";
        port.Handshake = Handshake.RequestToSend;
        if (port.IsOpen) { Console.WriteLine("port is now open"); } else { Console.WriteLine("port not opened correctly"); }
        port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
        port.Write("T");
        Console.WriteLine("bytes to read : {0}",port.BytesToRead);
        Console.WriteLine("return value form .read function : {0}",port.Read(buffer,0,20));
        Console.ReadLine();
    }

    static void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        Console.WriteLine(sp.ReadTo("\r"));

    }

}

出力は

ポートは現在開いています 読み取るバイト: 0 戻り値形式 .read 関数: 1 199.0,+238.0,091

port.bytestoread が 0 を返し、port.Read() がカウントを返さなければならないのに 1 つだけを返さなければならないのに、readTo() 関数が実際の出力を返す理由を誰かが理解するのを手伝ってくれますか?

4

1 に答える 1

1

これは、DataReceivedイベント ハンドラーがバックグラウンド スレッドから呼び出されるためです。このスレッドは、 after が呼び出されるport_DataReceivedまであなたを呼び出しません Console.WriteLine("bytes to read : {0}",port.BytesToRead);

于 2012-08-01T15:20:22.157 に答える