2013-04-23 57 views
0

我有這樣的代碼來自從設備Arduino的2的補讀取錯誤

byte buf[] = {125, 126, 127, 2000, 5000}; 

void setup() { 
    // initialize serial: 
    Serial.begin(9600); 

} 

void loop() { 
    int i = Serial.write(buf, sizeof(buf)); 
    Serial.println(i); 
    delay(5000); 

} 

,我有從聽音裝置的代碼。

char protocol[5]; 
void setup() { 
    Serial.begin(9600); 
    memset(protocol, '\0', sizeof(protocol)); 
} 


void loop() { 
    if(Serial.available()) { 
    Serial.readBytes(protocol, 5); 
    Serial.println(protocol); 
    for(int i = 0; i < sizeof(protocol); i ++) { 
    Serial.println((int)protocol[i], BIN); 
    } 
    } 
    else{ 
    Serial.println("None available"); 
    delay(500); 
    } 

} 

我明白的Arduino使用2的恭維,但我得到的問題是,打印出來就是這個

1111101 
1111110 
1111111 
11111111111111111111111111010000 
11111111111111111111111110001000 

因爲2的補的,被添加全零完成char,因爲最左邊的位讀入爲1.反正,第4,5個數字不是2000和5000,而是與這個數字大不相同。我如何讓附加的1消失,所以我讀了2000和5000?感謝

回答

1

這裏的問題是,你是存儲和傳輸每個號碼爲8位值,這是不是大到足以存儲數字2000或5000

要解決這個問題,你會想將緩衝區數組的類型更改爲int[]。具體方法如下:

在從機,則需要更改線路,你宣佈你的緩衝區:

int buf[] = {125, 126, 127, 2000, 5000}; 

而現在,類型是不同的,你必須添加一個類型轉換,因爲Serial.write期望charbyte陣列。

int i = Serial.write((char *) buf, sizeof(buf)); 

然後,您必須在偵聽器設備中進行類似的更改。聲明你陣列像這樣:

int protocol[5]; 

然後,Serial.readBytes,也期望一個字節數組,所以你需要另一個投(和sizeof得到正確的字節數讀):

Serial.readBytes((byte *) protocol, sizeof(protocol)); 

編輯:爲了解釋在從屬模式下工作的(char *)以及爲什麼有必要,請記住這是C++,因此(與在C中一樣),數組幾乎就是指針內部的指針。所以,當你創建5個int的數組時,真正發生的是你已經預留了10個字節的內存(足夠用於5個16位的int s)並且接收到一個指向它的開始的指針。現在,除非另有說明,否則C++會將它視爲五個int s。但是,如果您告訴它,將它視爲10 char s是非常高興的。這是非常方便的,因爲Serial.write只會採取一系列的char s(您記得,它就像一個char指針,因此char *)。這樣可以正常工作,因爲它會在整個行發送10個字節,如char s,其中監聽器將相同的10個字節放入陣列中。然後,對於10字節的內存塊的精確副本,陣列將具有與從屬中的buf陣列相同的int

最後一條評論:您可能希望讓您的收聽者等待,直到在嘗試閱讀之前實際上有sizeof(protocol)字節可用。否則,如果只有部分數據準備就緒,它將繼續並嘗試讀取,但通常只會在放棄並保留緩衝區之前等待其餘數據的一小段時間。您可以通過將>= sizeof(protocol)添加到適當的行來解決該問題:

if(Serial.available() >= sizeof(protocol)) { 
+0

您介意解釋(Char *)實際上做了什麼嗎?它使用int數組的起始地址嗎? – DRAN 2013-04-27 00:52:20

+0

@DRAN當然。我在我的回答中添加了一些解釋。希望它有幫助,但如果我沒有解釋得不夠好,請讓我知道。 – Dominick 2013-04-28 08:01:49

+0

@Dominick,先生,你能告訴我是否可以用這種方法發送浮點值?使用Char * cast? – 2014-07-28 02:18:43