首页 > 解决方案 > 如何在循环接收的串行数据时保持当前的处理状态?

问题描述

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

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

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

我会将代码放在这个问题中,但是自从我使用 Visual Studio Community 2019 以来,有超过 15 个文件分布在多个目录中。我从在https://www.codeproject.com/Articles/上找到的示例串行端口程序开始678025/Serial-Comms-in-Csharp-for-Beginners,并一直在努力提高我的技能组合以满足项目需求。

关于 Goggle 如何根据当前处理状态找到处理每个字符的方法的任何建议?

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

标签: c#serial-port

解决方案


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

至于处理传入的消息;

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

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

创建一个简单的函数来吃掉字符串中的一条消息。该函数应将字符串作为输入,并返回可能的消息和输入字符串的剩余字符。也就是说,输入字符串减去组成完整消息的前面的字符。如果未找到完整的消息,则该函数不应返回任何消息,并且应返回与输入相同的字符串。

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

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


推荐阅读