Спасибо вам за ответы!
Я не совсем понимаю как преобразовать ASCII-символы в буквы, цифры, знаки.
Может быть просто таблицу ASCII-символов загнать в массив и вы водить символы по индексу массива?
Например так:
тогда я оканчательно запутался!
я отправляю с компьютера на микроконтроллер букву z , а мне на мк приходит 122. Как мне зделатьтак чтобы всё приходило нормально?
Или мне нужно из Dec перекодировать в ASCII?
Mr.Denis писал(а):я отправляю с компьютера на микроконтроллер букву z , а мне на мк приходит 122.
Что значит "приходит"? И куда приходит? Как вы определяете, что именно туда приходит? Через терминал, подключённый к МК и на который выводите символы функцией printf()?
Предъявите кусок кода, с помощью которого считываете входящие символы.
И отправляется, и приходит одно и то же - восемь бит, означающие число 122, а дальше происходит та или иная интерпретация этого числа. Например, если это число послать на принтер, он отпечатает символ 'z', а если сложить с переменной int, то её значение увеличится на 122.
Ты, судя по всему, сначала получаешь символ ("ch = getch()"), а потом смотришь в переменную или дебаггером, или еще как-то, интерпретируя символ, как целое, вот тебе и видно не изображение, соответствующее символу, а его ASCII-код.
Выведи эту же самую переменную "ch" в устройство символьного вывода (например, на LCD, или в канал UART) и получишь не код, а символ. Пример того, как это может выглядеть в коде: "sprintf(buf,"Symbol:%c, code:%d",ch,ch); putlcd(buf);"
Вам Yellow Tiger всё разжевал. Остаётся добавить, что язык Си - это не Бэйсик, где символ и число разные вещи. В Си каждый символ - это код, который выводится как символ только в определённых местах (консоль, например) и с определёнными флагами. В остальном же - это число.
#include <mega8> #include <delay> #include <stdio> void main(void) { char ch[50]; UCSRA=0x02; UCSRB=0x18; UCSRC=0x86; UBRRH=0x00; UBRRL=0x67; while (1) { sprintf(ch,"%c",UDR); printf("Пришло: %s\n\r",ch);//здесь всё правильно работает if(ch==9){ printf("Пришло: %s\n\r",ch);}// эти условия не как не выполняются, // хотя должны ведь в переменную ch правильный символ пишется if(ch==1){ printf("Пришло: %s\n\r",ch);}
Mr.Denis писал(а):в переменную ch правильный символ пишется
Эта переменная - не символ, а массив символов длиной 50 символов. Упоминание имени массива эквивалентно адресу начала массива - с какого перепугу начало массива должно переместиться по адресу 9? ("ch==9") Подобное условие может выполниться только случайно!
Срочно - учить работу со строками и символами в Си!
Зачем ввели массив char ch[50], если и с простым char ch всё прекрасно работало бы?
Mr.Denis писал(а):if(ch==9)
Здесь две ошибки:
1. С числом именно массив сравнивать нельзя, а только конкретный элемент массива, например ch[0]==9.
2. Если хотите сравнивать пришедший символ именно с цифрой '9', а не с непечатываемым символом (настоятельно рекомендую хоть раз взглянуть на ASCII-таблицу), то нужно к 9 прибавить код символа '0', то есть 48: if(ch[0]==9+48 ). А можно ещё проще: if(ch[0]=='9'). Рекомендую использовать вместо массива один-единственный символ char ch. Тогда вместо ch[0] можно использовать просто ch.
А теперь совет: внимательно читайте ответы, которые вам дают. Потом долго и мучительно вникайте в них. Глядишь, другие вопросы даже и не появятся.
mackerel писал(а):Книги по Си неисчерпаемы, как атом...
Откуда такие сведения, типа - читал? У меня такого впечатления не сложилось, правда, я всего две книги по Сям читал - Кернигана/Ричи и ANSI-стандарт, и две по плюсАм - Страуструпа и "C++ how to program", граждан Deitel'ов, может оттого и не теряюсь, когда нужно навести справку - кругозора-то никакого.