Как передать int по USART?

Обсуждаем контроллеры компании Atmel.
Ellissar
Встал на лапы
Сообщения: 135
Зарегистрирован: Чт май 09, 2013 10:50:04

Как передать int по USART?

Сообщение Ellissar »

Использую Atmega8a. Из даташита стащил функцию отправки 8бит по USART. Всё работает нормально, в терминале на ПК символы приходят, но не могу сообразить как можно передать на ПК переменные типа integer?
Реклама
Аватара пользователя
igor-x
Мудрый кот
Сообщения: 1817
Зарегистрирован: Пн ноя 29, 2010 15:58:43

Re: Как передать int по USART?

Сообщение igor-x »

как вариант -передать в текстовом виде посимвольно : пример "123" три байта
Реклама
-=Vovka=-
Опытный кот
Сообщения: 844
Зарегистрирован: Пн апр 11, 2011 10:08:52

Re: Как передать int по USART?

Сообщение -=Vovka=- »

Например, так:

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

unsigned char x;
unsigned int a;

x = a >> 8; // старший байт
x = a & 0xFF; // младший байт
приняв, собираем:

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

unsigned char b[2]; // буфер, куда приняли байты
a = b[0]; // старший байт
a = a << 8; // сдивнули
a |= b[1]; // младший байт
По такому же принципу можно передавать/принимать любую разрядность
Ellissar
Встал на лапы
Сообщения: 135
Зарегистрирован: Чт май 09, 2013 10:50:04

Re: Как передать int по USART?

Сообщение Ellissar »

-=Vovka=- писал(а):Например, так:

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

unsigned char x;
unsigned int a;

x = a >> 8; // старший байт
x = a & 0xFF; // младший байт
По такому же принципу можно передавать/принимать любую разрядность
В терминале будет всякая ерунда выводиться если так делать. Мне именно для терминала надо.
igor-x писал(а): как вариант -передать в текстовом виде посимвольно : пример "123" три байта
Я понимаю что можно разбить число, но если цифры разные то как быть? например "1", "111", "555555555"? Получится какая-то сложная функция для преобразования сразу в unsigned char? Может быть есть готовые?
Реклама
Эиком - электронные компоненты и радиодетали
-=Vovka=-
Опытный кот
Сообщения: 844
Зарегистрирован: Пн апр 11, 2011 10:08:52

Re: Как передать int по USART?

Сообщение -=Vovka=- »

Ellissar писал(а):Может быть есть готовые?
в си есть функция sprintf(). Вот ей перегоняешь число в буфер - там каждый байт - символ.
Потом в цикле передаешь каждый символ.
Реклама
-=Vovka=-
Опытный кот
Сообщения: 844
Зарегистрирован: Пн апр 11, 2011 10:08:52

Re: Как передать int по USART?

Сообщение -=Vovka=- »

Кстати, задачу можно решить "в лоб" и без громоздкой функции sprintf():
Начнем с того, что максимальное значение числа равно 65535, т.е. 5 символов.

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

unsigned char a, buf[5];
unsigned int x; // тут наше число

for( a=0; a<5; a++ ) buf[a] = '0';

while( x>10000 ) { buf[0]++; x = x-10000; }
while( x>1000 )   { buf[1]++; x = x-1000; }
while( x>100 )     { buf[2]++; x = x-100; }
while( x>10 )       { buf[3]++; x = x-10; }
buf[4] = x;
Понятное дело, что этот код можно упростить, убрать лидирующие нули ....
Это решения для уровня "начинающий", хотя и рабочее :))
Реклама
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6321
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Как передать int по USART?

Сообщение Jack_A »

-=Vovka=- писал(а):

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

unsigned char a, buf[5];
unsigned int x; // тут наше число

for( a=0; a<5; a++ ) buf[a] = '0';

......
buf[4] = x;
Скорее buf[4] += x;
-=Vovka=-
Опытный кот
Сообщения: 844
Зарегистрирован: Пн апр 11, 2011 10:08:52

Re: Как передать int по USART?

Сообщение -=Vovka=- »

Ну вот, все испортил - весь код на блюдечке! :))
Ellissar
Встал на лапы
Сообщения: 135
Зарегистрирован: Чт май 09, 2013 10:50:04

Re: Как передать int по USART?

Сообщение Ellissar »

Завтра попробую :)
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Как передать int по USART?

Сообщение Engineer_Keen »

Если я правильно понял условие, то просто преобразовать x в buf[5] не прокатит. Чтобы в терминале нарисовалось "12345" надо еще коды цифр в ASCII перевести, т.е. к номеру цифры добавить 0x30
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
-=Vovka=-
Опытный кот
Сообщения: 844
Зарегистрирован: Пн апр 11, 2011 10:08:52

Re: Как передать int по USART?

Сообщение -=Vovka=- »

А что тогда делает мой код????
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Как передать int по USART?

Сообщение Engineer_Keen »

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

buf[a] = '0'
Кавычки сразу не увидел...
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Ellissar
Встал на лапы
Сообщения: 135
Зарегистрирован: Чт май 09, 2013 10:50:04

Re: Как передать int по USART?

Сообщение Ellissar »

Всем спасибо. Сделал так:

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

	int a = 1234, i = 0;
	unsigned char ch[10];

	while (a > 0)
	{
		ch[i] = (a % 10) + 0x30;
		i++;
		a /= 10;

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

Re: Как передать int по USART?

Сообщение ARV »

вообще-то для этого есть функция itoa
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Ellissar
Встал на лапы
Сообщения: 135
Зарегистрирован: Чт май 09, 2013 10:50:04

Re: Как передать int по USART?

Сообщение Ellissar »

ARV писал(а):вообще-то для этого есть функция itoa
Она принимает тип char, а мне нужен unsigned char. Как мне тогда преобразовать типы?
В цикле каждый символ приводить к нужному типу uchr = (unsigned char)chr?
Ellissar
Встал на лапы
Сообщения: 135
Зарегистрирован: Чт май 09, 2013 10:50:04

Re: Как передать int по USART?

Сообщение Ellissar »

Получается вот так:

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

	int chilso = 1234, num = 10;
	char chr[17];
	unsigned char chr1[17];
	int i = 0;

	itoa (chislo, chr, num);
	while (chr[i] != NULL)
	{
		chr1[i] = (unsigned char)chr[i];
		i++;
	}
	chr1[i] = NULL;
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Как передать int по USART?

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Как передать int по USART?

Сообщение Аlex »

Ellissar писал(а):Она принимает тип char
Ну вот откуда такие берутся, которые свои догадки выдают за реальность ? :facepalm:
Ну неужели трудно набрать слово "itoa" в поисковик ?
Первая же ссылка - https://ru.wikipedia.org/wiki/Itoa_(%D1%E8)
Цитата из неё :
void* itoa(int input, char *buffer, int radix)

itoa принимает передаваемое целое число input и конвертирует его в число в основании корня radix. Полученное число (последовательность цифр основания radix) записывается в буфер вывода buffer.
Что тут может быть непонятного ? Русским по белому всё разжёвано.
Ellissar
Встал на лапы
Сообщения: 135
Зарегистрирован: Чт май 09, 2013 10:50:04

Re: Как передать int по USART?

Сообщение Ellissar »

ARV писал(а):что у вас вызывает затруднения?
Код для вывода по USART которым я пользуюсь:

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

void USART_Transmit( unsigned char *data, unsigned char sz)
{
	cli();
	for (unsigned char i = 0; i<=sz; i++)
	{
		/* Ожидаем когда буфер станет пустым */
		while ( !( UCSRA & (1<<UDRE)) );
		/* Поместить данные в буфер, отправка данных */
		UDR = data[i];
	}
	sei();
}
Здесь лучше заменить unsigned char на char и всё будет корректно выводиться в терминал?
Я только учусь ещё и не знаю, может есть какие-то подводные камни если поменяю тип на char в этой функции.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Как передать int по USART?

Сообщение Аlex »

Ellissar писал(а):может есть какие-то подводные камни если поменяю тип на char в этой функции.
А Вы, когда писали в аргументе тип unsigned char, задумывались о подводных камнях ? Почему этот вопрос именно при переходе на char у вас возник ?
Вы вообще в курсе чем они отличаются ?
Ответить

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