Страница 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
А вот замените %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, то он ругается на:
Добавлено: Ср сен 09, 2009 22:50:26
Synergetik
Mr.Denis писал(а):Когда используешь не васив а просто переменную ch, то он ругается на:
Да, точно. 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"}
};
};