2016-02-05 84 views
1

在UWP应用程序中,我想从串口读取连续的数据流。 InputStream中包含连续的JSON对象是这样的:从串口读取连续数据流并反序列化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对象的长度。如何读取或缓冲流,以便我可以desirialize JSON流?类似load data from "{" to "}"

有没有最佳做法来做到这一点?

编辑:

我也可以影响数据发送方。也许最好以更好的格式发送serali数据?你有任何改善发送数据的建议吗?

+0

如果您可以影响发送端,为什么不包括将要发送的JSON的长度? – WiredPrairie

+0

@WiredPrairie发送JSON直到设备关闭。我事先不知道这个长度。我可以发送每个单个JSON对象的长度。但是,我也必须阅读这个“长度值”。我会怎么做? – CPA

+0

如果你不能这样做,你需要建立一个状态机,基本上是不断地连接结果,直到你检测到某种标记(可能是长度,但也可能是空行等等)。 – WiredPrairie

回答

1

您可以通过计算'{'括号的总数和'}'括号的总数来完成此操作。

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

步骤2:12:18递增整数为u遇到“{”

步骤3:一旦为u遇到的降低整数“}”:当计数器变为

步骤4 0获取字符位置并使用开始和结束位置从字符串中获取子字符串。 (这是你想要的JSON)。

第5步:反序列化Json。

+0

好的,我应该在LoadAsync之后做什么? – CPA

+0

是的,读取缓冲区,如果您在缓冲区结束之前完成计数器,请确保将剩余字符串存储在另一个缓冲区中,并将其添加到传入缓冲区 –

1

流包含对象之间的空行。所以,找两个连续的换行符,并解析到这一点。

+0

在哪一点我会这样做?在LoadAsync之前?你有没有一个例子,或者你能指点我一个类似的例子吗? – CPA