2017-07-18 19 views
-1
中的更改

我正在研究一個庫(供我自己使用),它可以通過i2c跨多個控制器無縫地同步一個結構。我大部分工作得很好,但我想檢查一下結構是否發生了變化,以便在發生這種情況時可以開始同步。檢查struct

爲了能夠通過串行(i2c)發送數據,我將它轉換爲char數組。

struct MyStruct { 
    int a = 123; 
    long b = 4567890; 
    String c = "abc"; 
}; 

MyStruct myData; 
char bufferP[sizeof(myData)]; 
memcpy(bufferP, &myData, sizeof(myData)); 

而在另一端我

memcpy(&myData, bufferP, sizeof(bufferP)); 

,使其恢復到一個結構。非常棒!

我試圖迭代通過bufferP檢查更改,以便知道何時進行同步,但只有在值的字符數有差異時纔會更改。

fx。如果結構是這樣的

struct MyStruct { 
    int a = 123; 
    long b = 4567890; 
    String c = "abc"; 
}; 

它將輸出出頭這樣

0 -> 123 
1 -> 0 
2 -> 82 
3 -> 179 
4 -> 69 
5 -> 0 
6 -> 143 
7 -> 2 
8 -> 3 
9 -> 0 
10 -> 3 
11 -> 0 

,如果結構是這樣

struct MyStruct { 
    int a = 123; 
    long b = 4567890; 
    String c = "def"; 
}; 

它將輸出完全一樣的事情。

有人可以告訴我爲什麼bufferP沒有變化嗎? 當我把它放回到結構中時,變化就像它們應該是蜜蜂一樣。

當我不知道結構的結構時,我該如何檢查結構是否發生了變化?

+3

什麼類型是String? – Galik

+0

不是'String c'的一個指針,就像'String c =「abc」;'?代碼如何傳輸該字符串的數據?這是一個字符串文字,所以比較(本地)指針可能會起作用,但假設它指向動態內存,其內容可能會更改? –

+2

我猜'String'不是純數據,它包含指針。指針不會使用您使用的技術進行序列化。 – Galik

回答

0

你有兩個選擇:

  1. 單獨序列化的字符串。這意味着:序列化結構沒有的字符串,然後序列化字符串的長度,然後序列化字符串的內容。

  2. 將字符串替換爲char[50]。 (或者適合你的任何尺寸)

+0

是的,但當我不知道結構時,我不能這樣做。 – XerXeX

+0

呵呵?你怎麼能不知道結構?無論如何,在你的問題中,你肯定知道結構。 –

+0

是的,但是如果對於一個庫,所以我不知道最終用戶如何決定在那裏構建struct,並且只要它在發送方和接收方都是一樣的,這應該不重要。 – XerXeX