Страница 51 из 421

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

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

Char array[3]={0,1,2,3};
Int i=UDR;
Char temp=array[i];
Можно так использовать? Или есть более простые варианты?

Добавлено: Ср сен 09, 2009 20:40:12
ARV
а зачем ASCII-символы переводить в буквы и знаки?! ведь ASCII это и есть буквы и знаки :)))

Добавлено: Ср сен 09, 2009 20:43:09
Mr.Denis
тогда я оканчательно запутался!
я отправляю с компьютера на микроконтроллер букву z , а мне на мк приходит 122. Как мне зделатьтак чтобы всё приходило нормально?
Или мне нужно из Dec перекодировать в ASCII?

Добавлено: Ср сен 09, 2009 20:47:48
Synergetik
Mr.Denis писал(а):я отправляю с компьютера на микроконтроллер букву z , а мне на мк приходит 122.
Что значит "приходит"? И куда приходит? Как вы определяете, что именно туда приходит? Через терминал, подключённый к МК и на который выводите символы функцией printf()?

Предъявите кусок кода, с помощью которого считываете входящие символы.

Добавлено: Ср сен 09, 2009 20:52:57
Yellow Tiger
И отправляется, и приходит одно и то же - восемь бит, означающие число 122, а дальше происходит та или иная интерпретация этого числа. Например, если это число послать на принтер, он отпечатает символ 'z', а если сложить с переменной int, то её значение увеличится на 122.
Ты, судя по всему, сначала получаешь символ ("ch = getch()"), а потом смотришь в переменную или дебаггером, или еще как-то, интерпретируя символ, как целое, вот тебе и видно не изображение, соответствующее символу, а его ASCII-код.
Выведи эту же самую переменную "ch" в устройство символьного вывода (например, на LCD, или в канал UART) и получишь не код, а символ. Пример того, как это может выглядеть в коде: "sprintf(buf,"Symbol:%c, code:%d",ch,ch); putlcd(buf);"

Добавлено: Ср сен 09, 2009 20:54:40
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]

Добавлено: Ср сен 09, 2009 20:57:13
Synergetik
Mr.Denis писал(а):

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

printf("%i",temp); 
А вот замените %i на %с.

Вам Yellow Tiger всё разжевал. Остаётся добавить, что язык Си - это не Бэйсик, где символ и число разные вещи. В Си каждый символ - это код, который выводится как символ только в определённых местах (консоль, например) и с определёнными флагами. В остальном же - это число.

Добавлено: Ср сен 09, 2009 21:37: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);}
      
}
};

Добавлено: Ср сен 09, 2009 22:00:16
Yellow Tiger
Mr.Denis писал(а):в переменную ch правильный символ пишется
Эта переменная - не символ, а массив символов длиной 50 символов. Упоминание имени массива эквивалентно адресу начала массива - с какого перепугу начало массива должно переместиться по адресу 9? ("ch==9") Подобное условие может выполниться только случайно!
Срочно - учить работу со строками и символами в Си!

Добавлено: Ср сен 09, 2009 22:06:23
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.

А теперь совет: внимательно читайте ответы, которые вам дают. Потом долго и мучительно вникайте в них. Глядишь, другие вопросы даже и не появятся.

Добавлено: Ср сен 09, 2009 22:23:37
Mr.Denis
Когда используешь не васив а просто переменную ch, то он ругается на:

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

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

Добавлено: Ср сен 09, 2009 22:50:26
Synergetik
Mr.Denis писал(а):Когда используешь не васив а просто переменную ch, то он ругается на:

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

sprintf(ch,"%c",UDR); 
Да, точно. sprintf требует строку.
А чем не устраивает? В предыдущей версии вашей программы на это вроде бы не ругался.

Добавлено: Чт сен 24, 2009 15:03:49
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;

Естественно, при компиляции ошибка - структура не определена.
Как мне разорвать этот порочный круг?

Добавлено: Чт сен 24, 2009 18:51:51
Yellow Tiger
Это называется "ссылка вперёд" - описана в книгах по Си.

Добавлено: Пт сен 25, 2009 10:00:06
mackerel
Yellow Tiger писал(а):Это называется "ссылка вперёд" - описана в книгах по Си.
Книги по Си неисчерпаемы, как атом...
А конкретно по этой ситуации посоветовать можете?

Добавлено: Пт сен 25, 2009 10:30:25
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, тогда внутри структуры можно ссылаться на это имя указателем.

Добавлено: Пт сен 25, 2009 11:41:23
mackerel
сначала даете своей структуре имя _MenueLineStructure, тогда внутри структуры можно ссылаться на это имя указателем.
Спасибо, сейчас буду пробовать.

Добавлено: Пт сен 25, 2009 12:11:32
mackerel
Получилось!

Добавлено: Пт сен 25, 2009 19:15:18
Yellow Tiger
mackerel писал(а):Книги по Си неисчерпаемы, как атом...
Откуда такие сведения, типа - читал? Изображение Изображение У меня такого впечатления не сложилось, правда, я всего две книги по Сям читал - Кернигана/Ричи и ANSI-стандарт, и две по плюсАм - Страуструпа и "C++ how to program", граждан Deitel'ов, может оттого и не теряюсь, когда нужно навести справку - кругозора-то никакого. Изображение

Добавлено: Сб сен 26, 2009 17:58:43
boobonick
Здравствуйте,подскажите,пожалуйста,не понимаю, компилятор выдает сообщение "missing ;" , а как эт перебороть и возможно ли так в структурах делать?

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

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


};