gpt4 book ai didi

C#:读取串口 - BytesToRead

转载 作者:太空狗 更新时间:2023-10-29 23:21:26 24 4
gpt4 key购买 nike

我正在修改一个基于 C# 的 UI,它连接到一个小型 PIC 微 Controller 测试仪设备。

UI 由几个按钮组成,这些按钮通过串行端口连接向微 Controller 发送“命令”来启动测试。每隔 250 毫秒,UI 就会轮询一次串行接口(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)是什么样的。通常有效,但并非总是有效。在发布的代码中,它不起作用,程序员只是任意延迟了两倍的时间。呃。

当然,最大的痛苦是 UI 线程在被迫休眠时非常紧张。很明显,绘制和响应用户输入变得非常慢。

这需要先关注协议(protocol)来修复。 PIC 需要在其响应中发送固定数量的字节,以便您可以简单地计算它们,或者为 PC 提供一种检测是否收到完整响应的方法。通常通过发送一个唯一字节作为响应的最后一个字节 (SerialPort.NewLine) 或通过将响应的长度作为字节值包含在消息的开头来完成。很难给出具体的建议,你根本没有描述协议(protocol)。

您可以保留 hacky 代码并将其移动到工作线程中,这样它就不会对 UI 造成如此严重的影响。您可以从 SerialPort.DataReceived 事件中免费获得一个。但这往往会产生两个问题,而不是解决核心问题。

关于C#:读取串口 - BytesToRead,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33686531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com