gpt4 book ai didi

c# - 停止等待来自串口的数据包

转载 作者:太空宇宙 更新时间:2023-11-03 13:51:32 31 4
gpt4 key购买 nike

我通过串口定期接收一些数据,以便绘制它并做更多的事情。为了实现这个目的,我将数据从我的微 Controller 发送到我的计算机,并带有一个 header ,它指定了每个数据包的长度。

除了最后一个细节外,我的程序运行良好且运行良好。当 header 指定长度时,我的程序在达到该字节数之前不会停止。因此,如果出于某种原因,丢失了一个数据包中的某些数据,程序将等待并获取下一个数据包的开头……然后开始真正的问题。从那一刻起,一切都失败了。

我考虑过每 0.9 秒启动一个计时器(包每秒来一次),它会发出命令以便返回等待并重置变量。但我不知道该怎么做,我试过了,但在运行时出现错误。由于 IndCom(见下一个代码)在某些功能和错误的中间重置,因为“索引越界”出现。

我附上我的代码(没有计时器)

private void routineRx(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
int BytesWaiting;


do
{
BytesWaiting = this.serialPort.BytesToRead;
//Copy it to the BuffCom
while (BytesWaiting > 0)
{
BuffCom[IndCom] = (byte)this.serialPort.ReadByte();
IndCom = IndCom + 1;
BytesWaiting = BytesWaiting - 1;
}

} while (IndCom < HeaderLength);
//I have to read until I got the whole Header which gives the info about the current packet

PacketLength = getIntInfo(BuffCom,4);

while (IndCom < PacketLength)
{
BytesWaiting = this.serialPort.BytesToRead;
//Copy it to the BuffCom
while (BytesWaiting > 0)
{
BuffCom[IndCom] = (byte)this.serialPort.ReadByte();
IndCom = IndCom + 1;
BytesWaiting = BytesWaiting - 1;
}
}

//If we have a packet--> check if it is valid and, if so, what kind of packet is
this.Invoke(new EventHandler(checkPacket));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

}

我是面向对象编程和 C# 的新手,所以请保持宽容!非常感谢你

最佳答案

您可能会使用 Stopwatch.

const long COM_TIMEOUT = 500;

Stopwatch spw = new Stopwatch();
spw.Restart();
while (IndCom < PacketLength)
{
//read byte, do stuff
if (spw.ElapsedMilliseconds > COM_TIMEOUT) break; //etc
}

在开始时重新启动秒表并检查每个 while 循环中的时间,然后在超时时中断(并清理)。 900 毫秒可能太多了,即使您只需要几个字节。 Com 流量非常快 - 如果您不立即了解所有内容,它可能不会来。

我喜欢在通信协议(protocol)中使用终止字符(如 [CR] 等)。这允许您阅读直到找到终止字符,然后停止。这可以防止读入下一个命令。即使您不想使用终止字符,也可以将您的代码更改为如下内容:

 while (IndCom < PacketLength)
{
if (serialPort.BytesToRead > 0)
{
BuffCom[IndCom] = (byte)this.serialPort.ReadByte();
IndCom++;
}
}

它允许您在达到数据包大小时停止,将所有剩余字符留在缓冲区中以供下一轮通过(即:下一个命令)。您也可以在上面添加秒表超时。

关于终止字符的另一个好处是你不必事先知道数据包应该有多长 - 你只需阅读直到到达终止字符,然后在你得到后处理/解析整个事情它。它使您的两步端口读取变为一步端口读取。

关于c# - 停止等待来自串口的数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13564309/

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