2011-05-06 2 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

+0

bdw любая причина, почему это сделано так, а не чтение заголовка или первых 3 байтов в одном цикле? – nixgadgets

+0

Вы хотите проверить байты синхронизации относительно каждой позиции в потоке. При чтении 3 байтов возникает много проблем. Чтобы выжить, вам понадобится конечный автомат. Перемещение байтов намного дешевле. – harper

3

Вызов read(fd, &prefix[2], 1) просто означает "хранить один байт в prefix[2]".

В общем, &a[n] тот же адрес, что (&a) + n

+0

thats то, что моя догадка была слишком. но можете ли вы понять, что делает остальная часть кода? Предполагается, что это простой цикл while для чтения первых двух байтов из COM-порта. – nixgadgets

+0

это своего рода обнаружение кадрирования - это зацикливание до тех пор, пока не увидит '0xfa 0xfb nn' – Alnitak

2

Это читает в префикс массива называется, начиная со смещением двух мест от начала массива. В этом случае читается только один символ, но можно прочитать больше.

1

Похоже, что этот фрагмент кода считывает поток последовательной связи, ожидающий начала заголовка, который помечен FA, FB. Петля while считывает символы по отдельности в prefix[2] и перемещает их назад по массиву.

Я думаю, что использование &prefix[2] трюк, который позволяет следующий символ в заголовке, чтобы появиться в prefix массиве, когда цикл while выходит через break.