Просто используйте atoi :
const char* txt = "12";
unsigned char by = (unsigned char ) atoi(txt);
И еще одна вещь.
printf("%d" , by);
Это не будет работать правильно, потому что printf ожидает подписанного int и получает неподписанный символ. Он может работать, только если ваша встроенная система имеет 8-битные целые числа, но не будет работать на ПК.
Причина, по которой вы получаете ошибку поврежденного стека, заключается в том, что sscanf интерпретировал% hhd как означающий, что он должен читать десятичное значение (я проверял это на моем компьютере), и поэтому он перезаписал память вокруг переменной «by» с помощью 4 байты (если у вас есть 32-битные целые).