2014-10-10 160 views
1

this教程的第一部分解釋瞭如何知道您接收到多少個字符時如何從Arduino的串行端口讀取數據。將數據從Arduino內部串行緩衝區移動到內存

的代碼是這樣的:

byte buffer = 0; 

void setup() { 
    Serial.begin(9600); // opens serial port, sets data rate to 9600 bps 
} 

void loop(){ 
if (Serial.available() >= 8) { //wait for the internal serial buffer to have all 8 characters in it 
    for (int i=0; i<8; i++) { 
    buffer[i] = Serial.read(); //move from internal buffer into memory 
    } 
} 

我不明白的部分是以下所示的行:

for (int i=0; i<8; i++) { 
buffer[i] = Serial.read(); 

這樣不是隻存儲第一位從內部串行緩衝器到我的變量「緩衝區」的所有8位?代碼應該不是更像這樣的東西?

for (int i=0; i<8; i++) { 
buffer[i] = Serial.read()[i]; 

回答

2

串行緩衝區是一個隊列(谷歌:堆棧vs隊列)。隊列中的字節按收到的順序處理。

Serial.read()從隊列中取第一個字節,讀取並刪除它。下一次調用Serial.read時,隊列中的下一個字節可用。

順便說一句,這就是爲什麼有一個Serial.peek命令。它讀取隊列中的下一個字節,但不會將其刪除。你可以用它來檢查隊列中的內容而不清除它

+0

謝謝你已經清除了一切。 – Blue7 2014-10-12 14:11:18

+0

@djUniversal,我想發送到Arduino超過64個字節。但它無法閱讀更多。我使用Serial.read(),但緩衝區過載。如果您有任何提示,請。這是我的問題http://stackoverflow.com/questions/30670717/how-do-i-receive-more-that-64-bytes-with-arduino – Robert 2015-06-05 20:39:05

1

UART通信是面向字節的。你從不處理單個位,這就是UART硬件的用途。

所以不,移動整個字節是正確的。

你的代碼有錯誤,它不會編譯。該buffer變量應該是一個數組:

byte buffer[8]; 

不,buffer[0] = Serial.read();不以某種方式塗抹一個比特到所有8位的,它只是複製一個8位的值,它的所有8位,從一個到另一個地方。數組索引操作符從不進行位級訪問,C不能像那樣工作。

檢查和循環與8是因爲它想要接收一個8字節的消息,它不是8位,如「8位」。

+0

但是它在一個for循環中,所以緩衝區的第一位,即buffer [1],將被分配所有的serial.read(),然後緩衝區的第二位,又名緩衝區[2],將被分配所有的serial.read()等。這是不可能的,因爲緩衝區[i]有點,並且serial.read()是一個字節。 這是for循環,真讓我困惑。你能向我解釋一下嗎? 謝謝。 – Blue7 2014-10-10 12:52:45

+1

@ Blue7'buffer'被宣佈爲錯誤,我試圖在我的回答中澄清這一點。 – unwind 2014-10-10 13:01:42

+1

'byte'(是一個Arduino,因此C++構造)實際上可以使用'[]'提供位級訪問,但我不這麼認爲。無論如何,你鏈接的代碼的意圖是從串口讀取8 **字節**到內存緩衝區。沒有必要考慮個別位。 – unwind 2014-10-10 13:07:41