c# - 如何在循环接收的串行数据时保持当前的处理状态?
问题描述
我正在用 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 应用程序。)
解决方案
您可以创建一个静态类,并在该类中创建一个或多个静态字段(如果需要,也可以将其称为变量)。只要只有一个设备,您就不需要非静态类,所以从这个开始以在您学习时保持简单。
至于处理传入的消息;
我会简单地通过在字符进入时将它们添加到字符串来缓冲字符。
然后,每次添加更多字符时,循环并尝试从字符串中获取完整的消息。如果没有完整的消息,则保持字符串不变。如果有完整的消息,则从字符串的开头删除相应的字符。当不能从字符串的开头吃掉更多完整的消息时,循环结束。
创建一个简单的函数来吃掉字符串中的一条消息。该函数应将字符串作为输入,并返回可能的消息和输入字符串的剩余字符。也就是说,输入字符串减去组成完整消息的前面的字符。如果未找到完整的消息,则该函数不应返回任何消息,并且应返回与输入相同的字符串。
这样,您无需在等待更多字符到达时保持高级解析器状态。您只需要保留未完成消息的字符的缓冲字符串。
请原谅我说的太详细了,但我不知道你的专业水平。
推荐阅读
- javascript - 希腊字符串转小写
- sql - Count(*) 在每次执行时返回不同的结果
- javascript - 查询未定义数组
- php - 在 WordPress 中设置自定义重写规则
- vim - MacOs 终端 Vim 复制到系统剪贴板
- javascript - 我误解了异步等待吗?(函数不等待数据)
- python - 想要将列表列表中的每个元素放入文件中
- php - 如何使用 jquery 获取 json 编码值
- rust - Rust的设计者选择符号的原因是什么!/&&/|| 而不是单词不是/和/或?
- node.js - MongoDB 的 NodeJS 问题:DeprecationWarning:collection.findAndModify 已弃用