C#如何获取串行写缓冲区上的字节数?

时间:2019-05-23 02:54:49

标签: c# timer serial-port serial-communication

我要在标签上进行串行写入时打印字节数

所以我为实时更新设置了一个计时器。

    ...    
    System.Windows.Forms.Timer tmr_Progress = new System.Windows.Forms.Timer;
    tmr_Progress.Interval = 100;
    tmr_Progress.Tick += new EventHandler(tmr_Progress_Tick);   
    ...


    void tmr_Progress_Tick(object sender, EventArgs e)
    {
        lbl_Progress.Text = "Now Send : " + Serial.BytesToWrite;
    }

    ...

    private void serialWrite(byte[] sendByte )
    {
        try
        {
            tmr_Progress.Start();
            Serial.Write(sendByte, 0, sendByte.Length);
            tmr_Progress.Stop();
        }
        catch (Exception ex)
        {
            Trace.WriteLine("Write Error : " + ex.Message + " / " + ex.StackTrace);
        }
    }

但是tmer不起作用,标签也不更新。

我在Serial.Write之前检查计时器。在tmr_Progress.Start();

之后,其enable属性变为true。

但是标签没有更新。如何获取串行写缓冲区的字节数?

1 个答案:

答案 0 :(得分:2)

串行端口的Write方法将数据写入.NET Framework的缓冲区或设备驱动程序,几乎不占用时间。

由于在写入后立即停止计时器,所以不会发生计时器事件。
要生成计时器事件,请删除“ tmr_Progress.Stop();”写入之后,在计时器事件处理程序中当BytesToWrite变为0时调用它。

但是,如果间隔为100毫秒,则大多数数据将已发送。进度指示器有什么意义吗?
另外,显示的文字是否合适? BytesToWrite的值是要发送的缓冲区中剩余的字节数。

如果仍然要显示,则应首先使用invokrequired调用并在调用之后立即在标签上立即显示标签上sendByte.Length的值,并按本文How to use SerialPort in .Net by using DataReceived event? DataReceived事件的文本显示中所示进行操作。