Например TDA7294

Форум РадиоКот • Просмотр темы - Как передать int по USART?
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Ср апр 24, 2024 02:50:25

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 56 ]  1, ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Как передать int по USART?
СообщениеДобавлено: Вс апр 05, 2015 13:24:11 
Встал на лапы

Зарегистрирован: Чт май 09, 2013 10:50:04
Сообщений: 135
Рейтинг сообщения: 0
Использую Atmega8a. Из даташита стащил функцию отправки 8бит по USART. Всё работает нормально, в терминале на ПК символы приходят, но не могу сообразить как можно передать на ПК переменные типа integer?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как передать int по USART?
СообщениеДобавлено: Вс апр 05, 2015 14:48:33 
Мудрый кот
Аватар пользователя

Карма: 3
Рейтинг сообщений: 60
Зарегистрирован: Пн ноя 29, 2010 15:58:43
Сообщений: 1815
Рейтинг сообщения: 0
как вариант -передать в текстовом виде посимвольно : пример "123" три байта


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как передать int по USART?
СообщениеДобавлено: Вс апр 05, 2015 15:02:38 
Опытный кот

Карма: 4
Рейтинг сообщений: 81
Зарегистрирован: Пн апр 11, 2011 10:08:52
Сообщений: 844
Рейтинг сообщения: 0
Например, так:
Код:
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]; // младший байт


По такому же принципу можно передавать/принимать любую разрядность


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Как передать int по USART?
СообщениеДобавлено: Вс апр 05, 2015 16:35:57 
Встал на лапы

Зарегистрирован: Чт май 09, 2013 10:50:04
Сообщений: 135
Рейтинг сообщения: 0
-=Vovka=- писал(а):
Например, так:
Код:
unsigned char x;
unsigned int a;

x = a >> 8; // старший байт
x = a & 0xFF; // младший байт

По такому же принципу можно передавать/принимать любую разрядность


В терминале будет всякая ерунда выводиться если так делать. Мне именно для терминала надо.

igor-x писал(а):
как вариант -передать в текстовом виде посимвольно : пример "123" три байта

Я понимаю что можно разбить число, но если цифры разные то как быть? например "1", "111", "555555555"? Получится какая-то сложная функция для преобразования сразу в unsigned char? Может быть есть готовые?


Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Как передать int по USART?
СообщениеДобавлено: Вс апр 05, 2015 16:52:02 
Опытный кот

Карма: 4
Рейтинг сообщений: 81
Зарегистрирован: Пн апр 11, 2011 10:08:52
Сообщений: 844
Рейтинг сообщения: 0
Ellissar писал(а):
Может быть есть готовые?

в си есть функция sprintf(). Вот ей перегоняешь число в буфер - там каждый байт - символ.
Потом в цикле передаешь каждый символ.


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Как передать int по USART?
СообщениеДобавлено: Вс апр 05, 2015 17:24:10 
Опытный кот

Карма: 4
Рейтинг сообщений: 81
Зарегистрирован: Пн апр 11, 2011 10:08:52
Сообщений: 844
Рейтинг сообщения: 0
Кстати, задачу можно решить "в лоб" и без громоздкой функции 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;

Понятное дело, что этот код можно упростить, убрать лидирующие нули ....
Это решения для уровня "начинающий", хотя и рабочее :))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как передать int по USART?
СообщениеДобавлено: Вс апр 05, 2015 18:21:29 
Друг Кота
Аватар пользователя

Карма: 62
Рейтинг сообщений: 840
Зарегистрирован: Вт апр 24, 2007 07:45:40
Сообщений: 5598
Откуда: Minsk
Рейтинг сообщения: 0
-=Vovka=- писал(а):
Код:
unsigned char a, buf[5];
unsigned int x; // тут наше число

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

......
buf[4] = x;



Скорее buf[4] += x;


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как передать int по USART?
СообщениеДобавлено: Вс апр 05, 2015 18:37:57 
Опытный кот

Карма: 4
Рейтинг сообщений: 81
Зарегистрирован: Пн апр 11, 2011 10:08:52
Сообщений: 844
Рейтинг сообщения: 0
Ну вот, все испортил - весь код на блюдечке! :))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как передать int по USART?
СообщениеДобавлено: Вс апр 05, 2015 18:58:20 
Встал на лапы

Зарегистрирован: Чт май 09, 2013 10:50:04
Сообщений: 135
Рейтинг сообщения: 0
Завтра попробую :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как передать int по USART?
СообщениеДобавлено: Вс апр 05, 2015 21:45:38 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 234
Зарегистрирован: Пт янв 29, 2010 10:27:40
Сообщений: 3851
Откуда: Москва
Рейтинг сообщения: 0
Если я правильно понял условие, то просто преобразовать x в buf[5] не прокатит. Чтобы в терминале нарисовалось "12345" надо еще коды цифр в ASCII перевести, т.е. к номеру цифры добавить 0x30

_________________
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как передать int по USART?
СообщениеДобавлено: Вс апр 05, 2015 22:02:04 
Опытный кот

Карма: 4
Рейтинг сообщений: 81
Зарегистрирован: Пн апр 11, 2011 10:08:52
Сообщений: 844
Рейтинг сообщения: 0
А что тогда делает мой код????


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как передать int по USART?
СообщениеДобавлено: Пн апр 06, 2015 07:26:45 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 234
Зарегистрирован: Пт янв 29, 2010 10:27:40
Сообщений: 3851
Откуда: Москва
Рейтинг сообщения: 0
Код:
buf[a] = '0'

Кавычки сразу не увидел...

_________________
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как передать int по USART?
СообщениеДобавлено: Пн апр 06, 2015 18:45:07 
Встал на лапы

Зарегистрирован: Чт май 09, 2013 10:50:04
Сообщений: 135
Рейтинг сообщения: 0
Всем спасибо. Сделал так:
Код:
   int a = 1234, i = 0;
   unsigned char ch[10];

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

   };


Можно преобразовать число любой длины как мне и надо.
Переменную i буду использовать чтоб потом собрать число в правильном порядке. :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как передать int по USART?
СообщениеДобавлено: Пн апр 06, 2015 18:51:44 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
вообще-то для этого есть функция itoa

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как передать int по USART?
СообщениеДобавлено: Пн апр 06, 2015 19:21:15 
Встал на лапы

Зарегистрирован: Чт май 09, 2013 10:50:04
Сообщений: 135
Рейтинг сообщения: 0
ARV писал(а):
вообще-то для этого есть функция itoa

Она принимает тип char, а мне нужен unsigned char. Как мне тогда преобразовать типы?
В цикле каждый символ приводить к нужному типу uchr = (unsigned char)chr[i]?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как передать int по USART?
СообщениеДобавлено: Пн апр 06, 2015 19:31:25 
Встал на лапы

Зарегистрирован: Чт май 09, 2013 10:50:04
Сообщений: 135
Рейтинг сообщения: 0
Получается вот так:
Код:
   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;


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как передать int по USART?
СообщениеДобавлено: Пн апр 06, 2015 19:41:57 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
вообще-то я не понял, что вы там натворили в коде... вам нужно получить строку из числа? itoa делает из числа строковое представление. после этого вам остается только вывести эту строку по USART. что у вас вызывает затруднения?

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как передать int по USART?
СообщениеДобавлено: Вт апр 07, 2015 09:04:52 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4510
Откуда: Планета Земля
Рейтинг сообщения: 2
Медали: 1
Получил миской по аватаре (1)
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.
Что тут может быть непонятного ? Русским по белому всё разжёвано.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как передать int по USART?
СообщениеДобавлено: Вт апр 07, 2015 15:14:02 
Встал на лапы

Зарегистрирован: Чт май 09, 2013 10:50:04
Сообщений: 135
Рейтинг сообщения: 0
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 в этой функции.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как передать int по USART?
СообщениеДобавлено: Вт апр 07, 2015 16:35:55 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4510
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Ellissar писал(а):
может есть какие-то подводные камни если поменяю тип на char в этой функции.
А Вы, когда писали в аргументе тип unsigned char, задумывались о подводных камнях ? Почему этот вопрос именно при переходе на char у вас возник ?
Вы вообще в курсе чем они отличаются ?


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 56 ]  1, ,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y