Как преобразовать int в char.
- Войдите на сайт для отправки комментариев
Сб, 13/10/2012 - 21:32
Проблема вот в чём:
Купил недавно 433Mhz RF link kit. И вот код для передатчика:
#include <VirtualWire.h> void setup() { Serial.begin(9600); // Debugging only Serial.println("setup"); // Initialise the IO and ISR vw_set_ptt_inverted(true); // Required for DR3100 vw_setup(2000); // Bits per sec } void loop() { const char *msg = "hello"; digitalWrite(13, true); // Flash a light to show transmitting vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); // Wait until the whole message is gone digitalWrite(13, false); delay(200); }
н
Извининте, создал случайно, не дописал тему
так вот, он посылает переменную msg типа char. А мне необходимо посылать переменную типа int (показания датчика). При вот такой попытке:
Компилятор выдаёт ошибку:
Надо как то преобразовать показания датчика (int) в char. Но вот как это сделать?
А почему в char? Функция vw_send() принимает указатель на byte. И еще раз перечитайте, те ссылки которые я вам дал в предыдущей теме и посмотрите вот эту тему.
А почему в char? Функция vw_send() принимает указатель на byte. И еще раз перечитайте, те ссылки которые я вам дал в предыдущей теме и посмотрите вот эту тему.
Спасибо! А в предыдущей теме вы мне ничего не давали. Её нет просто :)
Опишу в чем проблема. Функция vw_send() принимает указатель на массив типа byte (uint8_t). У вас переменная типа int (int16_t), вам нужно разделить int на 2 byte и поместить эти 2 байта в массив. Выше я дал вам ссылку на тему, где практически решина ваша проблема, вам только остается 2 полученных байта из переменной int поместить в массив.
понятно, спасибо
Ну вы blackhand совсем не хотите форум читать, заводите практически одинаковые темы.
Передача данных по радиоканалу при помощи VirtualWire
Хм, функция с byte не работает
А что это?
Почитайте тут:
Квалификатор const
Массивы
Указатели
это нерабочий код
Вы перестаньте дергаться между темами и по нормально во всем разберитесь. Вы выбрали путь когда вам нужно данные с датчика разбить по байтам и отправить. vxl выбрал путь преобразования данных в коды АСКИ и передачи. Скажу сразу первый вариант хоть и сложнее, но более правильный.
это нерабочий код
И так, почему ругается компилятор?
Первая причина в том, что вы пытаетесь присвоить константе переменную. Давайте разберемся, что же не так. Рассмотрим на примере пластилина, то есть его можно как угодно мять. Вы компилятор. Вот у вас два одинаковых куска пластилина. Операция присваивания "=" означает, что нужно взять один кусок пластилина и сделать его такой же формы как и другой. Вам говорят: "приствойте пластилин А к пластилину В"
вы берете и мнете, все нормально, сделали.
Константа - это кусок твердого пластилина, замороженный пластелин. И вам говорят: "сделайте кусок замерзшего пластилина А такой же формы как и В.
Что же вы ответите на это? Я не могу! Он твердый! Руки больно! Вот и компилятор не может присвоить константе переменную.
Вторая причина - это то что вы пытаетесь указателю присвоить переменную.
Указатель это всего лишь адрес массива. Вам говорят сделайте пластилин формой Россия г. Москва, ул.Тверская дом 1. Вы понимаете что такое форма куба, форма шара и т.д. но как форма может быть адресом??? Это как вообще такое возможно??? Да никак. Вот по этой причине и ругается компилятор.
Что бы привоить массиву переменную нужно обратиться к элементу массива
Или можно указателю присвоить адрес переменной
Первая причина ...
byte b;
const byte *msg = &b;
Это отлично компилируется.
Ибо, хотя b и переменная, но адрес у нее неизменный. А константе msg, имеющей тип "указатель на байт", ничего иного, кроме адреса, присваивать не имеет смысла.
Поэтому из двух причин остается одна - вторая.
Да, если передать адрес. Но изначально нужно было собрать массив, что бы его передать, так что остается две причины.
Так же не компилируется:
или так:
Вот так:
byte b[2]; // 3,4.5,.. сколько угодно
const byte *msg = &b[0];
Массив b "собран".
Так в том то и дело, что нужно было собрать из нескольких байт (не массива) массив msg, а не присвоить адрес готового массива указателю.
Еще раз объясню в чем задача, есть функция, которая отправляете данные по радиоканалу:
есть некий датчик, который возвращает значения например от -1000 до 1000 и сохраняет их в переменной:
Вопрос как отправить данные???
Выше я дал ссылку на то как разделить переменную типа int на две типа byte
step962, теперь понятно?
Еще раз объясню в чем задача, есть функция, которая отправляете данные по радиоканалу:
есть некий датчик, который возвращает значения например от -1000 до 1000 и сохраняет их в переменной:
Вопрос как отправить данные???
Принимая во внимание, что целое - это два последовательно расположенных байта оперативной памяти (то есть готовый массив из двух элементов типа uint8_t), рискну предположить, что как-то так:
vw_send((uint8_t *)&sens,2);
Без разборки целого числа на отдельные байты и без последующей сборки из этих отдельных байтов массива.
Да, я бы, если честно до такого не додумался, все гениальное просто! Не нужно двигать биты:
Мощная штука ссылка...
Мощная штука ссылка...
но, как и ножик острый - чреватая серьезными последствиями при непочтительном с ней обращении.