我有一个线程来读取和解析串行数据。 消息采用二进制格式,以字符“F”,“S”,“Q”或“M”开头。 没有换行符,也没有特殊的结束字符(上述字符表示消息已完成,之前的所有内容都已准备好进行解析)。
如何连续读取和解析数据?
我想到的只是一个4096字节长的输入缓冲区(字节数组),然后按照以下步骤操作:
SerialPort.Read(buffer, position, byteCount)
你能想到更快/更容易的方法吗?
答案 0 :(得分:4)
一个非常简单的方法就是停止尝试让它更快。没有必要,串口数据速率非常非常低,现代计算机非常非常快。您的Read()
调用只会返回一个字节,很少会返回2。
请注意,这很难看到,当您调试并单步执行代码时,您会大量减慢程序的速度。允许接收更多字节,因此Read()
调用返回更多字节。但是当程序以正常速度运行时,这不会发生。
所以请改用SerialPort.BaseStream.ReadByte()
。使代码非常简单。
答案 1 :(得分:2)
获得使用SerialPort C#组件的一些经验
一开始:不经意地使用串口。
然后:
第一个并行任务:在常规之后继续阅读整个缓冲区内容 interval并将读取的块推送到“Gathering Collection”数据中。
第二个并行任务:分析“收集集合”以查看已完成的“短语”,将已克隆的“短语”委派给< em>“短语管理器”并排除“收集集合”中的短语
你对“收集馆藏”的实施有自由,但对我来说重要的是:
读取全部,但不是来自串口缓冲区的大小内容
为避免损失并在邮件中保存订单,建立自己的端口调度程序,而不是让任何人随时打开和关闭您的端口进行读/写。
实验检测端口读取频率。更频繁的读操作会让你的代码检测到一个“短语”并启动proder handlind。在没有检测到“短语”的情况下频繁阅读可能会花费您额外的资源使用量。