2017-08-09 88 views
0

我是一個初學者,我想用一個指針向4個成員鍵入BIN提供一個結構表,然後將它們發送到另一個,serial2。我沒有這樣做。Arduino - 如何從serial.read()提供結構?

我從serial1.read()收到4個字符,例如'A''10''5''3'。 爲了減小數據的大小,我想用一個結構:

struct structTable { 
    unsigned int page:1; // (0,1) 
    unsigned int cric:4; // 10 choices (4 bits) 
    unsigned int crac:3; // 5 choices (3 bits) 
    unsigned int croc:2; // 3 choices (2 bits) 
}; 

我聲明並設置:實例和指針

struct structTable structTable; 
struct structTable *PtrstructTable; 
PtrstructTable = &structTable; 

然後我試着喂這樣的:

for(int i = 0; i<=4; i++) { 
    if(i == 1) { 
    (*PtrProgs).page = Serial.read(); 
    if(i == 2) { 
    (*PtrProgs).cric = Serial.read(); 

依此類推。但它不工作...

我試着喂第一個字符表,並試圖把結果:

(*PtrProgs).page = PtrT[1], BIN; 

而現在,我知道我不能在同一時間喂3位!衛生署!所有這些看起來都非常薄弱,對於4個值而言,這當然是一個太長的過程。 (我想保留這種結構表更多的實例)。

請問,你能幫我找到一個簡單的方法來餵我的表嗎?

+1

Pleasse顯示一致的一段代碼。即請儘可能靠近[mcve]。 – Yunnosch

+0

非常抱歉,我會做 – patatos

+0

我做到了。謝謝。 – patatos

回答

0

您只能通過串行端口發送完整字節。但是你也可以直接發送原始數據。

void send (const structTable* table) 
{ 
    Serial.write((const char*)table, sizeof(structTable)); // 2 bytes. 
} 

bool receive(structTable* table) 
{ 
    return (Serial.readBytes((char*)table, sizeof(structTable)) == sizeof(structTable)); 
} 

你還必須知道的sizeof(int)的是並非適合所有CPU

字節排列順序一個字相同。爲你的結構在串行鏈路的另一端程序中的定義,如果具有不同字節一個CPU上運行將成爲:

struct structTable { 
    unsigned short int croc:2; // 3 choices (2 bits) 
    unsigned short int crac:3; // 5 choices (3 bits) 
    unsigned short int cric:4; // 10 choices (4 bits) 
    unsigned short int page:1; // (0,1) 
}; 

注意使用短整型的,你還可以在使用arduino代碼更精確。原因是short int在大多數CPU上是16位,而int可能是16,32甚至64位。

+0

謝謝Michael Roy。我會嘗試這個問題,然後問這個帖子後面的新問題。 – patatos

+0

只要確保在另一端的程序中使用相同的打包結構來發送/接收數據。這種發送/接收數據的方式非常普遍,例如IP棧使用的技術是相同的。 –

1

根據Arduino參考資料,我只是查找Serial::read,代碼逐字節地返回數據(一次8位)。所以可能你應該只讀取一個字節的數據(一次8位),並在事後進行解包。

實際上,您可能希望使用union(有關如何使用union的信息,請參見this other stackoverflow post),以便您可以充分利用這兩種方式。具體而言,如果您定義union的定義,並將位拆分,並將union的第二部分定義爲一個或兩個字節,則可以將數據作爲字節發送,然後將其解碼爲您感興趣的位。

UPDATE

這裏是一些更多細節的嘗試。關於工會有很多警告 - 它們不可移植,它們依賴於編譯器等等,但這可能值得嘗試。

typedef struct { 
    unsigned int page:1; // (0,1) 
    unsigned int cric:4; // 10 choices (4 bits) 
    unsigned int crac:3; // 5 choices (3 bits) 
    unsigned int croc:2; // 3 choices (2 bits) 
} structTable; 

typedef union { 
    structTable a; 
    uint16_t b; 
} u_structTable; 

serial.Read(val1); 
serial.Read(val2); 

u_structTable x; 
x.b = val1 | (val2<<8); 
printf("page is %d\n", x.a.page); 
+0

我實際上是從串口逐字節地讀數據。但是,我想發送這4個字節到下一個序列(沒有選擇序列),並在表格中保留一些信息(可能是10)... sketch跟在 – patatos

+0

之後,所以既然你有10個位,寫它作爲兩個字節與聯合並讀取它的方式。 –

+0

謝謝你的回答。然而,我想保持成員的最小可能的大小,這就是爲什麼我試圖堅持一點點。 – patatos