【问题标题】:Reading continuous data flow from serial port and deserialize JSON objects从串口读取连续数据流并反序列化 JSON 对象
【发布时间】:2016-05-15 06:11:51
【问题描述】:

在 UWP 应用中,我想从串行端口读取连续数据流。输入流包含连续的 json 对象,如下所示:

{
  "sensor": "gps",
  "time": 1351824120,
  "data": [
    48.75608,
    2.302038
  ]
}

{
  "sensor": "gps",
  "time": 1351824120,
  "data": [
    48.75608,
    2.302038
  ]
}

{
  "sensor": "gps",
  "time": 1351824120,
  "data": [
    48.75608,
    2.302038
  ]
} 

...

为了监听端口,我正在使用

var dataReaderObject = new DataReader(SerialPort.InputStream);.

我也在使用一个任务来等待 serialPort.InputStream 上的数据。

Task<UInt32> loadAsyncTask = dataReaderObject.LoadAsync(ReadBufferLength);

但问题是,我不知道一个 JSON 对象的长度。如何读取或缓冲流,以便我可以反序列化 JSON 流? load data from "{" to "}" 之类的东西。

是否有任何最佳做法可以做到这一点?

编辑:

我也可以影响数据发送方。也许以更好的格式发送 serali 数据会更好?您对改进发送的数据有什么建议吗?

【问题讨论】:

  • 如果你可以影响发送方,为什么不只包括将要发送的 JSON 的长度?
  • @WiredPrairie 发送 JSON 直到设备关闭。我不知道提前的长度。我可以发送每个 JSON 对象的长度。但是我也必须阅读这个“长度值”。我该怎么做?
  • 如果你不能这样做,你需要构建一个状态机来不断连接结果,直到你检测到某种标记(可能是长度,但也可能是空行等)。
  • 我在 Raspberry Pi 和 Windows IoT Core 上遇到了同样的问题。我能想象的最简单的解决方案是将 ReadBufferLength 的值设置为 1 并将每个值与某个标记进行比较。在我的情况下,我有一个来自另一个设备的 JSON 数组,我尝试将当前缓冲区值与“]”字符进行比较以确定流的结尾。但是我的应用程序在尝试使用此类缓冲区时抛出异常(它不显示有关此异常的任何详细信息)。你的问题成功了吗?

标签: c# .net json serialization uwp


【解决方案1】:

您可以通过计算“{”大括号的总数和“}”大括号的总数来做到这一点。

第 1 步:声明一个整数来存储计数。

第 2 步:现在一旦遇到 '{' 就增加整数

第 3 步:遇到 '}' 时立即减小整数

第4步:当计数器变为0时,获取字符位置并使用开始和结束位置从字符串中获取子字符串。 (这就是你想要的 JSON)。

第 5 步:反序列化 Json。

【讨论】:

  • 好的,我应该在 LoadAsync 之后什么时候这样做?
  • 是的,读取缓冲区,如果你在缓冲区结束之前完成了计数器。确保将剩余的字符串存储在另一个缓冲区中,并将其添加到传入缓冲区中
【解决方案2】:

流在对象之间包含一个空行。因此,查找两个连续的换行符,并解析到该点。

【讨论】:

  • 我会在什么时候这样做?在 LoadAsync 之前?你有例子吗,或者你能指出一个类似的例子吗?
猜你喜欢
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
相关资源
最近更新 更多