快速读取和解析串行数据的方法

时间:2015-07-06 11:19:16

标签: c# arduino serial-port buffer

我有一个线程来读取和解析串行数据。 消息采用二进制格式,以字符“F”,“S”,“Q”或“M”开头。 没有换行符,也没有特殊的结束字符(上述字符表示消息已完成,之前的所有内容都已准备好进行解析)。

如何连续读取和解析数据?

我想到的只是一个4096字节长的输入缓冲区(字节数组),然后按照以下步骤操作:

  • 手动跟踪缓冲区中的位置
  • 通过SerialPort.Read(buffer, position, byteCount)
  • 向其附加可用数据
  • 尝试从缓冲区中解析尽可能多的消息
  • 将其余部分复制到临时缓冲区
  • 重置输入缓冲区
  • 将临时缓冲区的内容复制到原始缓冲区
  • 在缓冲区中设置位置

你能想到更快/更容易的方法吗?

2 个答案:

答案 0 :(得分:4)

一个非常简单的方法就是停止尝试让它更快。没有必要,串口数据速率非常非常低,现代计算机非常非常快。您的Read()调用只会返回一个字节,很少会返回2。

请注意,这很难看到,当您调试并单步执行代码时,您会大量减慢程序的速度。允许接收更多字节,因此Read()调用返回更多字节。但是当程序以正常速度运行时,这不会发生。

所以请改用SerialPort.BaseStream.ReadByte()。使代码非常简单。

答案 1 :(得分:2)

获得使用SerialPort C#组件的一些经验

一开始:不经意地使用串口。

然后:

第一个并行任务:在常规之后继续阅读整个缓冲区内容 interval并将读取的块推送到“Gathering Collection”数据中。

第二个并行任务:分析“收集集合”以查看已完成的“短语”,将已克隆的“短语”委派给< em>“短语管理器”并排除“收集集合”中的短语

你对“收集馆藏”的实施有自由,但对我来说重要的是:

  • 读取全部,但不是来自串口缓冲区的大小内容

  • 为避免损失并在邮件中保存订单,建立自己的端口调度程序,而不是让任何人随时打开和关闭您的端口进行读/写。

  • 实验检测端口读取频率。更频繁的读操作会让你的代码检测到一个“短语”并启动proder handlind。在没有检测到“短语”的情况下频繁阅读可能会花费您额外的资源使用量。