我正在修改与小型PIC微 Controller 测试仪设备接口(interface)的基于C#的UI。
UI由几个按钮组成,这些按钮通过通过串行端口连接向微 Controller 发送“命令”来启动测试。 UI每250毫秒轮询一次串行接口(interface),以查找包含PIC测试结果的简短消息。该消息显示在文本框中。
我继承的代码如下:
try
{
btr = serialPort1.BytesToRead;
if (btr > 0)
Thread.Sleep(300);
btr = serialPort1.BytesToRead;
if (btr > 0)
{
Thread.Sleep(300);
btr = serialPort1.BytesToRead;
numbytes = serialPort1.Read(stuffchar, 0, btr);
for (x = 0; x < (numbytes); x++)
{
cc = (stuffchar[x]);
stuff += Convert.ToString(Convert.ToChar((stuffchar[x])));
}
在最后读取串行端口之前的前几行(由对BytesToRead的三个调用和两个300毫秒的 sleep 调用)组成的基本原理是什么?除非我错误地解释了代码,否则成功读取串行端口将花费600毫秒以上的时间,这对我来说似乎是特有的。
最佳答案
这是一个关于SerialPort.Read()行为的可怕骇客。它仅返回实际接收的字节数。通常只有1个或2个,串行端口很慢,而现代PC则非常快。因此,通过调用Thread.Sleep(),代码会将UI线程延迟足够长的时间,以使Read()调用返回更多字节。希望所有这些协议(protocol),无论协议(protocol)是什么样的。通常有效,但并非总是如此。在发布的代码中,它没有任何作用,程序员只是任意延迟了两倍的时间。啊。
当然,最大的痛苦是,UI线程在被迫进入休眠状态时会产生严重的故障。非常明显,绘制和响应用户输入的速度非常慢。
首先需要注意协议(protocol),以修复此问题。 PIC需要在其响应中发送固定数量的字节,因此您可以简单地将其计算在内,或者为PC提供一种方法来检测已收到完整的响应。通常通过发送唯一的字节作为响应的最后一个字节(SerialPort.NewLine)或通过在消息的开头将响应的长度作为字节值来完成。很难给出具体建议,您根本没有描述协议(protocol)。
您可以保留hacky代码并将其移至工作线程中,以免严重影响UI。您可以从SerialPort.DataReceived事件中免费获得一个。但这往往会产生两个问题,而不是解决核心问题。
关于C#:读取串行端口-BytesToRead,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33686531/