我正在编写一个小型应用程序,供客户用来读取刻度尺上的数据。
我遇到的问题是,从秤上实际加重并显示在软件上开始,会有一个巨大的延迟。有了超级终端,它是准确而即时的,下面的代码运行了大约一分钟后,我不得不等待大约40秒才能更新计数。
该秤被设置为19200 BAUD汇率,并且不能降低到更低的水平,否则会丢失读数。
我正在使用SerialDataReceivedEventHandler,但是我不确定这是否是最快的方法。
下面是我的代码吗,我可以加快速度吗?
我不能错过任何读物
如何设置缓冲区或加快缓冲区的速度,还是应该读字节而不是使用readline?
我试图从字符串中删除所有格式,并且只是将其原始写入文本文件中,不幸的是,这只会使其变慢。
private void StartReadBtn_Click(object sender, EventArgs e)
{
port = new SerialPort(ComLbl.Text, Convert.ToInt32(BaudLbl.Text), Parity.None, 8, StopBits.One);
try
{
port.Open();
}
catch
{
port.Close();
port.Open();
}
port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
}
//Event Handler to read com port data
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
try
{
sp.Open();
}
catch
{
}
CommData = sp.ReadLine();
if (readingcount < 7)
{
readingcount++;
}
else
{
OldCom = Convert.ToInt32(oldData);
try
{
NewCom = Convert.ToDecimal(CommData.Substring(5, 5));
}
catch
{
//incase a string is caught with incorrect characters
}
label1.Invoke(new Action(() => label1.Text =CommData));
}
}
我需要这样的响应能力,以使我实际上可以实时将数据读取到软件中,而不是比秤落后几秒钟。如果我看Hyperterminal,那么秤每秒可以传输约60行数据,我需要能够实时捕获所有数据
答案 0 :(得分:0)
也许是因为您以自己的想法使用ReadLine()。
ReadLine()假定文本数据以NewLine属性值结尾。直到收到NewLine值代码或发生超时,它才会结束。
读取BytesToRead property而不是ReadLine(),指定数据大小,然后执行Read()。
然后,仔细检查接收到的数据是否符合电子秤设备编程指南中所述的数据格式。
否则,在DataReceivedHandler的开头执行Open()是错误的。如果确实需要这样做,那么其他地方可能有问题,那就需要使用Open()。
此外,每次单击StartReadButton时创建一个SerialPort对象是一个不好的用途。
电子秤设备的编程指南似乎描述了诸如读取开始/停止和零刻度的命令以及如何使用它们。为此创建一个程序。