Как преобразовать int в char.

blackhand
Offline
Зарегистрирован: 13.10.2012

 Проблема вот в чём:

Купил недавно 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);
}

н

blackhand
Offline
Зарегистрирован: 13.10.2012

Извининте, создал случайно, не дописал тему

blackhand
Offline
Зарегистрирован: 13.10.2012

так вот, он посылает переменную msg типа char. А мне необходимо  посылать переменную типа int (показания датчика). При вот такой попытке: 

void loop()
{
    int msg = 1;

    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);
}

Компилятор выдаёт ошибку:

transmitter.cpp: In function 'void loop()':
transmitter.pde:-1: error: invalid conversion from 'int' to 'const char*'
transmitter.pde:-1: error: initializing argument 1 of 'size_t strlen(const char*)'

 Надо как то преобразовать показания датчика (int) в char. Но вот как это сделать?

maksim
Offline
Зарегистрирован: 12.02.2012

А почему в char? Функция vw_send() принимает указатель на byte. И еще раз перечитайте, те ссылки которые я вам дал в предыдущей теме и посмотрите вот эту тему.

blackhand
Offline
Зарегистрирован: 13.10.2012

maksim пишет:

А почему в char? Функция vw_send() принимает указатель на byte. И еще раз перечитайте, те ссылки которые я вам дал в предыдущей теме и посмотрите вот эту тему.

Спасибо! А в предыдущей теме вы мне ничего не давали. Её нет просто :)

maksim
Offline
Зарегистрирован: 12.02.2012

 Опишу в чем проблема. Функция vw_send() принимает указатель на массив типа byte (uint8_t). У вас переменная типа int (int16_t), вам нужно разделить int на 2 byte и поместить эти 2 байта в массив. Выше я дал вам ссылку на тему, где практически решина ваша проблема, вам только остается 2 полученных байта из переменной int поместить в массив.

blackhand
Offline
Зарегистрирован: 13.10.2012

понятно, спасибо

maksim
Offline
Зарегистрирован: 12.02.2012

 Ну вы blackhand совсем не хотите форум читать, заводите практически одинаковые темы.

Передача данных по радиоканалу при помощи VirtualWire

 

 

blackhand
Offline
Зарегистрирован: 13.10.2012

Хм, функция с byte не работает

void loop()
{
 
  byte b ;
    const byte *msg = b;

    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);
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

А что это?

  byte b;
  const byte *msg = b;

Почитайте тут:
Квалификатор const
Массивы
Указатели

 

blackhand
Offline
Зарегистрирован: 13.10.2012

это нерабочий код

 

maksim
Offline
Зарегистрирован: 12.02.2012

 Вы перестаньте дергаться между темами и по нормально во всем разберитесь. Вы выбрали путь когда вам нужно данные с датчика разбить по байтам и отправить. vxl выбрал путь преобразования данных в коды АСКИ и передачи. Скажу сразу первый вариант хоть и сложнее, но более правильный.

blackhand пишет:

это нерабочий код

byte b;
const byte *msg = b;

И так, почему ругается компилятор?
Первая причина в том, что вы пытаетесь присвоить константе переменную. Давайте разберемся, что же не так. Рассмотрим на примере пластилина, то есть его можно как угодно мять. Вы компилятор. Вот у вас два одинаковых куска пластилина. Операция присваивания "=" означает, что нужно взять один кусок пластилина и сделать его такой же формы как и другой. Вам говорят: "приствойте пластилин А к пластилину В"

byte A;
byte B = A;

вы берете и мнете, все нормально, сделали.
Константа - это кусок твердого пластилина, замороженный пластелин. И вам говорят: "сделайте кусок замерзшего пластилина А такой же формы как и В.

byte A;
const byte B = A;

Что же вы ответите на это? Я не могу! Он твердый! Руки больно! Вот и компилятор не может присвоить константе переменную.

Вторая причина - это то что вы пытаетесь указателю присвоить переменную.

byte A;
byte *B = A;

Указатель это всего лишь адрес массива. Вам говорят сделайте пластилин формой Россия г. Москва, ул.Тверская дом 1. Вы понимаете что такое форма куба, форма шара и т.д. но как форма может быть адресом??? Это как вообще такое возможно??? Да никак. Вот по этой причине и ругается компилятор. 

Что бы привоить массиву переменную нужно обратиться к элементу массива

byte A;
byte *B;

где нибудь в функции:

B[0] = A;

Или можно указателю присвоить адрес переменной

byte A;
byte *B = &A;

 

 

step962
Offline
Зарегистрирован: 23.05.2011

maksim пишет:

Первая причина ...


byte b;
const byte *msg = &b;

Это отлично компилируется.
Ибо, хотя b и переменная, но адрес у нее неизменный. А константе msg, имеющей тип "указатель на байт", ничего иного, кроме адреса, присваивать не имеет смысла.
Поэтому из двух причин остается одна - вторая.

maksim
Offline
Зарегистрирован: 12.02.2012

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

maksim
Offline
Зарегистрирован: 12.02.2012

 Так же не компилируется:

byte a;
byte b;
const byte *msg = {&a, &b}; ???

 или так:

byte a;
byte b;
const byte *msg = {a, b}; ???

 

step962
Offline
Зарегистрирован: 23.05.2011

Вот так:
byte b[2]; // 3,4.5,.. сколько угодно
const byte *msg = &b[0];

Массив b "собран".

maksim
Offline
Зарегистрирован: 12.02.2012

Так в том то и дело, что нужно было собрать из нескольких байт (не массива) массив msg, а не присвоить адрес готового массива указателю.

maksim
Offline
Зарегистрирован: 12.02.2012

 Еще раз объясню в чем задача, есть функция, которая отправляете данные по радиоканалу:

vw_send((uint8_t *)msg, strlen(msg));

есть некий датчик, который возвращает значения например от -1000 до 1000 и сохраняет их в переменной:

int sens = readSensor;

Вопрос как отправить данные???

Выше я дал ссылку на то как разделить переменную типа int на две типа byte
step962
, теперь понятно?

step962
Offline
Зарегистрирован: 23.05.2011

maksim пишет:

 Еще раз объясню в чем задача, есть функция, которая отправляете данные по радиоканалу:

vw_send((uint8_t *)msg, strlen(msg));

есть некий датчик, который возвращает значения например от -1000 до 1000 и сохраняет их в переменной:

int sens = readSensor;

Вопрос как отправить данные???

Принимая во внимание, что целое - это два последовательно расположенных байта оперативной памяти (то есть готовый массив из двух элементов типа uint8_t), рискну предположить, что как-то так:

vw_send((uint8_t *)&sens,2);

Без разборки целого числа на отдельные байты и без последующей сборки из этих отдельных байтов массива.

maksim
Offline
Зарегистрирован: 12.02.2012

Да, я бы, если честно до такого не додумался, все гениальное просто! Не нужно двигать биты:

int val = 300;
byte HighByte;
byte LowByte;

void setup() {
  Serial.begin(9600);

  // Способ со сдвигом битов
  HighByte = (byte)((val >> 8) & 0xFF);
  LowByte = (byte)(val & 0xFF);
  // Выводим в сериал-монитор
  Serial.print(HighByte, DEC);
  Serial.print(" ");
  Serial.println(LowByte, DEC);

  // Способ с присваиванием ссылки
  byte *x = (byte *)&val;
  HighByte = x[1];
  LowByte = x[0];
  // Выводим в сериал-монитор
  Serial.print(HighByte, DEC);
  Serial.print(" ");
  Serial.println(LowByte, DEC);
}

void loop() {
}

Мощная штука ссылка...

step962
Offline
Зарегистрирован: 23.05.2011

maksim пишет:

Мощная штука ссылка...

но, как и ножик острый - чреватая серьезными последствиями при непочтительном с ней обращении.