【解決方法】serialport.readtimeoutプロパティを設定してもシリアル読み取り操作がタイムアウトしませんか?


シリアル ポート (RS-232) を介して、それぞれが 8 つのチャネルを持つ 8 つの (Data Acquisition DAQ) カードから取得したデータを表示するための HMI を開発しています。

特定の DAQ カードが取得したデータを特定の時間間隔 (たとえば 20 秒) 内にシリアル送信できなかった場合に HMI がメッセージを表示し、データの取得を続行するタイムアウト操作を実装したいと考えています。残りのカードから。

このために、serialPort.ReadTimeout = 20000 を設定していますが、期待どおりに操作が適切にタイムアウトしません。

BackgroundWorker クラスを使用して、カードから 4000 サンプルのデータをシリアルに送信および取得していますが、タイムアウト機能を除いて正常に動作しています。 誰でも問題を指摘できますか?

私が試したこと:

//code snippet
    serialP.DataBits = 8;
    serialP.StopBits = StopBits.One;
    //serialP.Handshake = Handshake.RequestToSend;
    serialP.Parity = Parity.None;
    
    serialP.DataReceived += serialP_DataReceived;

    serialP.WriteTimeout = 20000; 
    serialP.ReadTimeout = 20000;
    
    serialP.Open();            
   
    serialRtx.DoWork += serialRtx_DoWork;            

    if (!serialRtx.IsBusy)
        serialRtx.RunWorkerAsync();

    serialRtx.RunWorkerCompleted += serialRtx_RunWorkerCompleted;
    
}

    private void serialRtx_DoWork(object sender, DoWorkEventArgs e)
    {
     //Send token packets to DAQ cards sequentially
    }

    private void serialP_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        while (serialP.BytesToRead > 0)
        {                
            dataBytet1 = serialP.ReadByte();                
            dataByte2 = serialP.ReadByte();                               
                           
            try
            {               
                logData[sample_No, chNo - 1] = ((dataBytet1 * 256) + dataByte2 );                     

                chNo++;

                if (chNo > 8)
                {
                    sample_No++;
                    chNo = 1;
                }

                if (sample_No > 3999)//total 4000 samples of 8 channels
                {
                    cardNo++;
                    sample_No = 0;
                }                
            }
            catch (IndexOutOfRangeException)
            { }                
        }
    }

解決策 1

読み取りタイムアウトは 1文字あたり、カードごとではありません。したがって、単一のシリアルポートを使用する8つのカードがある場合、デバイスのいずれかが何かを送信するたびに、ポートタイムアウト全体がリセットされます.

私がそれを行う方法は、単一のレシーバーをセットアップすることです。これは、処理のためにデータを個別の BackgroundWorker スレッドに「プッシュ」します (そして、必要に応じて、これらのスレッドから単一のシリアル ポートにメッセージをディスパッチします)。 DAカード。 そのスレッドは、メインのレシーバー スレッドではなく、タイムアウトを担当します。

理にかなっていますか、それともあなたがここで何をしているのか正確に誤解していますか?

コメント

タイトルとURLをコピーしました