从c中的串行端口接收大量数据并使用progressbar

本文关键字:数据 progressbar 串行端口 | 更新日期: 2023-09-27 18:28:58

我的串行端口正在接收大量数据,需要大约5秒才能完成数据传输。我想在C#中使用进度条。

如何识别应用进度条的数据传输结束

(数据大小恒定且清晰)

从c中的串行端口接收大量数据并使用progressbar

.net框架的SerialPort类可以很容易地为您做到这一点。它同时支持同步和异步传输模式。对您的案例使用异步模式,并使用DataReceived事件更新进度条。它将简单地为(TotalBytesReadTillNow/TotalDataSize)*100。将其分配给progressbar.value

还要注意,在异步编程中,不能从非UI线程更新控件或其他UI内容。使用Invoke更新用户界面。

上面的链接包含了一个很好的例子。

我假设您使用的是System.IO.SerialPort类?在"是"的情况下,SerialPort类有一个DataReceived事件:

http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived.aspx

它会在每次通过串行端口接收数据时触发。现在假设您知道需要接收5个字节。在开始接收数据之前,您将进度条的最大值设置为5:

progressBar1.Maximum = 5;

然后,当您收到数据时,根据您收到的数据量增加进度条:

    private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    int BytesReceivedCount = sp.BytesToRead;
    if(InvokeRequired)
    {
        Invoke((Action)(() =>
        {
            progressBar1.Value += BytesReceivedCount;
        }));
    }
    else
        progressBar1.Value += BytesReceivedCount;
}