95% времени основной цикл занимается тем, что ждет, пока таймер запишет в CalcedWaveLength что-либо ненулевое.
Таймер в CalcedWaveLength записывает посчитанную длительность импульса как только импульс закончится. При этом в качестве единицы измерения используются не микросекунды, а в вызовы таймера. Если на ноге существовала 1 в течении 4х вызовов таймера - в CalcedWaveLength попадет именно 4. И попадет она туда строго после того, как импульс закончится.
Этот веселый цикл for (;CalcedWaveLength==0 со смайликом тупо стоит и ждет пока таймер не запишет CalcedWaveLength. Как только обнаружилось, что в переменной CalcedWaveLength не 0 (таймер записал значение), цикл ожидания завершается и идет программа дальше.
После получения CalcedWaveLength сохраняем ее значение, обнуляем (чтобы не пропустить следующую длительность импульса) и шлем в комп полученные данные.
В новом коде сразу идет анализ полученных данных исходя из известных длительностей.
Код:
uint8_t cwl=CalcedWaveLength;
CalcedWaveLength=0;
if ((cwl>2)&&(cwl<5))
UART_SendByte('0');
else
if ((cwl>=5)&& (cwl<8))
UART_SendByte('1');
else
UART_SendByte('?');