CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Mr.Denis
Прорезались зубы
Сообщения: 220
Зарегистрирован: Пт авг 07, 2009 22:06:49
Откуда: Россия, Москва

Сообщение Mr.Denis »

Спасибо вам за ответы!
Я не совсем понимаю как преобразовать ASCII-символы в буквы, цифры, знаки.
Может быть просто таблицу ASCII-символов загнать в массив и вы водить символы по индексу массива?
Например так:

Код: Выделить всё

Char array[3]={0,1,2,3};
Int i=UDR;
Char temp=array[i];

Можно так использовать? Или есть более простые варианты?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

а зачем ASCII-символы переводить в буквы и знаки?! ведь ASCII это и есть буквы и знаки :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Mr.Denis
Прорезались зубы
Сообщения: 220
Зарегистрирован: Пт авг 07, 2009 22:06:49
Откуда: Россия, Москва

Сообщение Mr.Denis »

тогда я оканчательно запутался!
я отправляю с компьютера на микроконтроллер букву z , а мне на мк приходит 122. Как мне зделатьтак чтобы всё приходило нормально?
Или мне нужно из Dec перекодировать в ASCII?
Аватара пользователя
Synergetik
Встал на лапы
Сообщения: 117
Зарегистрирован: Чт фев 28, 2008 23:54:35
Откуда: Воскресенск, МО
Контактная информация:

Сообщение Synergetik »

Mr.Denis писал(а):я отправляю с компьютера на микроконтроллер букву z , а мне на мк приходит 122.

Что значит "приходит"? И куда приходит? Как вы определяете, что именно туда приходит? Через терминал, подключённый к МК и на который выводите символы функцией printf()?

Предъявите кусок кода, с помощью которого считываете входящие символы.
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

И отправляется, и приходит одно и то же - восемь бит, означающие число 122, а дальше происходит та или иная интерпретация этого числа. Например, если это число послать на принтер, он отпечатает символ 'z', а если сложить с переменной int, то её значение увеличится на 122.
Ты, судя по всему, сначала получаешь символ ("ch = getch()"), а потом смотришь в переменную или дебаггером, или еще как-то, интерпретируя символ, как целое, вот тебе и видно не изображение, соответствующее символу, а его ASCII-код.
Выведи эту же самую переменную "ch" в устройство символьного вывода (например, на LCD, или в канал UART) и получишь не код, а символ. Пример того, как это может выглядеть в коде: "sprintf(buf,"Symbol:%c, code:%d",ch,ch); putlcd(buf);"
Mr.Denis
Прорезались зубы
Сообщения: 220
Зарегистрирован: Пт авг 07, 2009 22:06:49
Откуда: Россия, Москва

Сообщение Mr.Denis »

Код: Выделить всё

#include <mega8> 
#include <delay>
#include <stdio>
void main(void)
{
int temp;
UCSRA=0x02;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x67;
while (1)
      {
       temp=UDR;
       
          printf("%i",temp);
          delay_ms(1000);

};
}
[/code]
Аватара пользователя
Synergetik
Встал на лапы
Сообщения: 117
Зарегистрирован: Чт фев 28, 2008 23:54:35
Откуда: Воскресенск, МО
Контактная информация:

Сообщение Synergetik »

Mr.Denis писал(а):

Код: Выделить всё

printf("%i",temp); 

А вот замените %i на %с.

Вам Yellow Tiger всё разжевал. Остаётся добавить, что язык Си - это не Бэйсик, где символ и число разные вещи. В Си каждый символ - это код, который выводится как символ только в определённых местах (консоль, например) и с определёнными флагами. В остальном же - это число.
Mr.Denis
Прорезались зубы
Сообщения: 220
Зарегистрирован: Пт авг 07, 2009 22:06:49
Откуда: Россия, Москва

Сообщение Mr.Denis »

Вот написал простейшую программу, а она не контачит ((((

Код: Выделить всё

#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);}
     
}
};
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Mr.Denis писал(а):в переменную ch правильный символ пишется
Эта переменная - не символ, а массив символов длиной 50 символов. Упоминание имени массива эквивалентно адресу начала массива - с какого перепугу начало массива должно переместиться по адресу 9? ("ch==9") Подобное условие может выполниться только случайно!
Срочно - учить работу со строками и символами в Си!
Аватара пользователя
Synergetik
Встал на лапы
Сообщения: 117
Зарегистрирован: Чт фев 28, 2008 23:54:35
Откуда: Воскресенск, МО
Контактная информация:

Сообщение Synergetik »

Зачем ввели массив 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.

А теперь совет: внимательно читайте ответы, которые вам дают. Потом долго и мучительно вникайте в них. Глядишь, другие вопросы даже и не появятся.
Mr.Denis
Прорезались зубы
Сообщения: 220
Зарегистрирован: Пт авг 07, 2009 22:06:49
Откуда: Россия, Москва

Сообщение Mr.Denis »

Когда используешь не васив а просто переменную ch, то он ругается на:

Код: Выделить всё

       sprintf(ch,"%c",UDR); 
Аватара пользователя
Synergetik
Встал на лапы
Сообщения: 117
Зарегистрирован: Чт фев 28, 2008 23:54:35
Откуда: Воскресенск, МО
Контактная информация:

Сообщение Synergetik »

Mr.Denis писал(а):Когда используешь не васив а просто переменную ch, то он ругается на:

Код: Выделить всё

sprintf(ch,"%c",UDR); 

Да, точно. sprintf требует строку.
А чем не устраивает? В предыдущей версии вашей программы на это вроде бы не ругался.
mackerel
Открыл глаза
Сообщения: 70
Зарегистрирован: Пт янв 30, 2009 18:02:40

Сообщение mackerel »

Вообще-то это вопрос по C:
Определяю структуру
typedef struct
{
u8b LinesQuantity;
u8b LineNumber;
u8b LineAction;
MenueLineStructure *LineNextLevel; //указатель на такую-же структуру
void (*LineFunction)(void);
u8b LineNameLength;
u8b LineName[20];
u8b LineParameterPosition;
u8b LineParameterType;
} MenueLineStructure;

Естественно, при компиляции ошибка - структура не определена.
Как мне разорвать этот порочный круг?
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Это называется "ссылка вперёд" - описана в книгах по Си.
mackerel
Открыл глаза
Сообщения: 70
Зарегистрирован: Пт янв 30, 2009 18:02:40

Сообщение mackerel »

Yellow Tiger писал(а):Это называется "ссылка вперёд" - описана в книгах по Си.

Книги по Си неисчерпаемы, как атом...
А конкретно по этой ситуации посоветовать можете?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

mackerel писал(а):
Yellow Tiger писал(а):Это называется "ссылка вперёд" - описана в книгах по Си.

Книги по Си неисчерпаемы, как атом...
А конкретно по этой ситуации посоветовать можете?

Код: Выделить всё

typedef struct _MenueLineStructure{ 
   u8b LinesQuantity;
   u8b LineNumber;
   u8b LineAction;
   struct _MenueLineStructure *LineNextLevel; //указатель на такую-же структуру
   void (*LineFunction)(void);
   u8b LineNameLength;
   u8b LineName[20];
   u8b LineParameterPosition;
   u8b LineParameterType;
} MenueLineStructure;


то есть сначала даете своей структуре имя _MenueLineStructure, тогда внутри структуры можно ссылаться на это имя указателем.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
mackerel
Открыл глаза
Сообщения: 70
Зарегистрирован: Пт янв 30, 2009 18:02:40

Сообщение mackerel »

сначала даете своей структуре имя _MenueLineStructure, тогда внутри структуры можно ссылаться на это имя указателем.

Спасибо, сейчас буду пробовать.
mackerel
Открыл глаза
Сообщения: 70
Зарегистрирован: Пт янв 30, 2009 18:02:40

Сообщение mackerel »

Получилось!
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

mackerel писал(а):Книги по Си неисчерпаемы, как атом...
Откуда такие сведения, типа - читал? Изображение Изображение У меня такого впечатления не сложилось, правда, я всего две книги по Сям читал - Кернигана/Ричи и ANSI-стандарт, и две по плюсАм - Страуструпа и "C++ how to program", граждан Deitel'ов, может оттого и не теряюсь, когда нужно навести справку - кругозора-то никакого. Изображение
Аватара пользователя
boobonick
Встал на лапы
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

Сообщение boobonick »

Здравствуйте,подскажите,пожалуйста,не понимаю, компилятор выдает сообщение "missing ;" , а как эт перебороть и возможно ли так в структурах делать?

Код: Выделить всё

struct  { 
char lcd_menu_master[x_element][y_element]= {
{"Menu1"},
{"Menu2"},
{"Menu3"}
};


};

Ответить

Вернуться в «AVR»