2016-02-05 29 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