Skip to content

Instantly share code, notes, and snippets.

@btolfa
Last active December 14, 2015 20:08
Show Gist options
  • Save btolfa/5141632 to your computer and use it in GitHub Desktop.
Save btolfa/5141632 to your computer and use it in GitHub Desktop.
Пример как писать интерпретатор для байт полученных по usart. 2 команды 'x' и 'p'. После 'p' идёт 2 байта данных. Команды выполняются по \r\n
void MakeCmdX();
void MakeCmdP(uint16_t code);
uint16_t code;
char cmd = 0;
uint8_t c = 0;
/* Команды
x - Стоп
p - Установить NMR Period, 2 байта данных
s - Установить NMR Stop, 2 байта данных
e - Установить ЭПР Period, 2 байта данных
d - Установить ЭПР Stop, 2 байта данных
*/
void MakeSomeCmd() {
if (cmd == 'x') {
MakeCmdX();
} else {
switch (cmd) {
case 'p':
break;
}
}
}
void interpret(char s) {
switch (s) {
case 'p':
case 'x':
case 's':
case 'e':
case 'd':
if (cmd == 0) {
cmd = s;
c = 0;
code = 0;
} else {
cmd = 0;
}
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
if ((cmd == 'p' || cmd == 's' || cmd == 'e' || cmd == 'd') && c < 4) {
code = code << 4;
if ( s <= '9' ) {
code |= s - '0';
} else {
code |= s - 'A' + 0xA;
}
c++;
} else {
cmd = 0;
}
break;
case '\r':
case '\n':
MakeSomeCmd();
cmd = 0;
break;
default:
cmd = 0;
break;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment