Несколько соображений.
Видимо, блокировка прерываний - особенность используемого компилятора, потому что у меня на IAR для AVR и MSP все нормально.
Если свой парсер команд, то scanf неудобно.
Делать scanf только для настроечного интерфейса? - мало смысла.
Обычно вначале выбирают протокол передачи, типа wake, в прерываниях складывают принятые байты в буфер, контролируют контрольную сумму, и потом разбирают принятый буфер. Это для команд.
Для настроечного интерфейса у меня передаются только цифры, и я делал тупо свой "scanf" для положительного числа из макс 4 цифр:
uchar GetPosValue(char old_value)
[pre]
{ char i;
char x;
int result=0;
for (i=0; i<4; i++) {
x= getchar();
if ((x=='\r')|(x==' '))
{ if (i==0) return(old_value);
else break;}
if ((x<0x30)|(x>0x39)) { printf("\rerr\r"); return(old_value);}
else result=((result*10)+(x-0x30));
}
if (result>255) { printf("\rtoo much"); return(old_value);}
else return((char)result);
}
[/pre]