如何在循环接收到的串行数据时保持当前的处理状态?

How can I maintain the current state of processing while looping through received serial data?

我正在用 C# 在 Windows 10 PC 上为 运行 编写应用程序。此应用程序将通过串行端口控制被测设备 (DUT)。它还将在 USB and/or 以太网控制下控制几台测试设备(如数字仪表、电源等)。

在 C 中,我会创建一个静态变量来保存当前的处理状态,例如“正在寻找定界符”、“找到定界符”、“找到行尾”等。不能保证当前缓冲区中有一条完整的消息,因此当代码读取尽可能大的数据块时,需要根据构成有效消息的规则一次处理一个字符。

我正在尝试弄清楚如何用其他东西(可能是 class)替换静态变量的概念,但我对 C# 太陌生了,不知道从哪里开始。我的代码有一个函数,每当从串行端口接收到数据时都会调用该函数。

我会把代码放在这个问题中,但是自从我使用 Visual Studio Community 2019 以来,有超过 15 个文件分布在多个目录中。我从在 [=10= 上找到的示例串行端口程序开始] 并一直在努力提高我的技能以满足项目需求。

对于 Goggle 根据当前处理状态找到处理每个字符的方法,有什么建议吗?

(我只想用 C 编写应用程序,但这会带来一系列其他问题,主要是弄清楚如何用 C 编写可以访问串行端口的 Windows 应用程序。)

您可以创建一个静态 class,并在其中 class 一个或多个静态字段(如果需要,也可以将其称为变量)。只要只有一台设备,您就不需要非静态 class,因此从这个开始,让您在学习时保持简单。

关于处理传入消息;

我会在字符进入时将它们添加到字符串中来简单地缓冲这些字符。

然后,每次添加更多字符时,循环并尝试从字符串中吃掉完整的消息。如果没有完整的消息,则保持字符串不变。如果有完整的消息,则从字符串的开头删除相应的字符。当从字符串的开头不能吃掉更多完整的消息时,循环结束。

创建一个简单的函数来从字符串中获取一条消息。该函数应将字符串作为输入,return 可能的消息和输入字符串的其余字符。即输入的字符串减去前面的字符组成一条完整的消息。如果找不到完整的消息,该函数应该 return 没有消息,并且与输入的字符串相同。

这样,您无需在等待更多字符到达时保持高级解析器状态。您只需要保留未完成消息的字符的缓冲字符串。

请原谅我说得太详细了,但我不知道你的专业水平。