2011-05-06 86 views
1

對於你們中的一些人來說,這可能相當簡單。關於C++的問題

我在看以下串行讀取功能,我不能完全理解&prefix[2]在這裏所做的。這是否意味着只能填充兩個字節或其他內容?

我還應該提到這是玩家/舞臺平臺的一部分。

while (1) 
{ 
    cnt = 0; 
    while (cnt != 1) 
    { 
    if ((cnt += read(fd, &prefix[2], 1)) < 0) 
    { 
     perror("Error reading packet header from robot connection: P2OSPacket():Receive():read():"); 
     return (1); 
    } 
    } 

    if (prefix[0] == 0xFA && prefix[1] == 0xFB) 
    { 
    break; 
    } 

    GlobalTime->GetTimeDouble(&timestamp); 

    prefix[0] = prefix[1]; 
    prefix[1] = prefix[2]; 

} 

回答

3

該片段實現了尺寸3.

最舊的值是在prefix[0]prefix[2]最新的一個移位寄存器。這就是爲什麼prefix[2]的地址被傳遞給函數read()

當前兩個字節爲FA FB時,當前(最後一次接收的)字節在prefix[2]中。如果不能讀取任何內容(read的返回值與1不同),則該功能在該點之前保留。

此移位寄存器用於無法預測在同步字符前面是否接收到其他字節的情況FA FB。每次讀取操作讀取三個字節將不允許在數據流中的某處進行同步。

+0

感謝的人。你節省了我的頭幾個小時抓了一個簡單的事情。我正在閱讀閱讀字節和丟失情節的大圖。 – nixgadgets 2011-05-06 11:05:01

+0

bdw爲什麼它以這種方式完成而不是在單個循環中讀取標題或前3個字節? – nixgadgets 2011-05-06 11:06:29

+0

您想檢查流中每個位置的同步字節。讀取3個字節時會出現很多問題。你需要一個狀態機才能生存。移動字節要便宜得多。 – harper 2011-05-07 06:28:12

3

呼叫read(fd, &prefix[2], 1)只是意味着 「一個字節中存儲prefix[2]」。

一般來說,&a[n]是相同的地址(&a) + n

+0

多數民衆贊成我的猜測是太。但是你能理解代碼的其餘部分嗎?假設這是一個簡單的while循環來從com端口讀取前兩個字節。 – nixgadgets 2011-05-06 10:48:07

+0

它是某種框架檢測 - 它循環直到看到0xfa 0xfb nn' – Alnitak 2011-05-06 11:01:57

2

據讀入的陣列稱爲前綴,起始於從陣列的開始的偏移兩個地方。在這種情況下,只有一個字符正在讀取,但可以讀取更多。

1

它看起來像這段代碼正在讀取一個串行通信流,等待標記爲FA,FB標題的開始。 while循環將字符單獨讀入prefix[2],並將它們在陣列中向後混洗。

我認爲使用的是&prefix[2]特技這使得下一個字符在標題中出現prefix陣列中時while循環退出通過break