我的串口正在接收大量数据,需要大约5秒才能完成传输数据。我想在C#中使用进度条。
如何识别应用进度条的数据传输结束?
(数据大小恒定且清晰)
答案 0 :(得分:0)
我假设您正在使用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;
}
答案 1 :(得分:0)
SerialPort .net框架类可以轻松地为您完成。它支持同步和异步传输模式。对您的案例使用异步模式,并使用DataReceived
事件更新您的进度条。它只是(TotalBytesReadTillNow / TotalDataSize)* 100.将此值分配给progressbar.value
。
另请注意,在异步编程中,您无法从非UI线程更新控件或其他UI内容。使用Invoke
更新您的用户界面。
上面的链接包含了一个很好的例子。