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

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

Используется следующая библиотека: www.open.com.au/mikem/arduino/VirtualWire.pdf

Вот функция отправления информации:

const char *msg = "hello";

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

Необходимо отправить следующую информацию:

String timestamp = "2012.10.13 10:00";

float voltage = 5.56;

float current = 1.56;

float power = 8.67;

 

Поскольку msg - константа, "склеить" информацию для отправки не выходит (timestamp + "," + voltage + "," + current + "," + power).

Подскажите, пожалуйсто, решение проблемы.

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

Посмотрел описание библиотеки, не знаю почему так написаны функции, что что они принимают только uint8_t* (byte*) и не могут принимать int8_t* (char*) и уж никак не String, наверное было лень автору этим заморачиваться.
Для решения ваше проблемы вам нужно знать что такое:
Тип char
Тип byte
Указатели
Массив
"Tип" string
Есть еще такой вариант - все манипуляции делаете с String, а когда строка для отправки полностью сформирована преобразовываете ее в массив байтов и отправляете.

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

Можете, пожалуйста, подсказать, как это реализовать на практике?

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

 Ну вы ребята blackhand и vxl совсем не хотите форум читать одновременно два человека заводите практически одинаковые темы.
Как преобразовать int в char.

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

Спасибо, maksim, за ссылку.
Проблема в недостаточном знании синтаксиса С. Можете, пожалуйста, привести пример кода, который преобразовывал был переменную типа String (в строку "склеить" все параметры у меня получается) в Byte?

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

Вам надо было повнимательнее изучить класс String у него есть метод toCharArray (здесь он не переведен, но есть на arduino.cc), который как раз и делает то что вам нужно, но работает он почему-то только со статическим массивом, поэтому прикиньте максимальную длинну сообщения и объявите char msg[макс. дл.]; так.

String data = "0123456789ASDFGHJ";
char msg[50];

......


  data.toCharArray(msg, data.length()+1);
  vw_send((byte*)msg, strlen(msg));

 

 

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

Спасибо Вам большое!

Все получилось!

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

vxl пишет:

Спасибо Вам большое!

Все получилось!

Можешь код показать, который скомпилился?

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

Тот же код, что написал maksim.

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

maksim пишет:

Ну вы ребята blackhand и vxl совсем не хотите форум читать одновременно два человека заводите практически одинаковые темы.
Как преобразовать int в char.

Извиняюсь, vxl, это просто я их увидил в одно время... 

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

эмм, ну там  как то надо загнать эти данные в массив, код неполный же

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

у меня тоже получилось, но ресивер принимает от передатчика значения, ставя перед каждой цифрой "3".

То есть число 100 выглядит как 313030, чило 1 как 31, 2 как 32 и т.д

Это можно как то исправить?

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

blackhand пишет:

Это можно как то исправить?

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

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

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

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

 

Спасибо

P.S я в первую очередь сверился с аски, "1" там не "31"

 

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

Потому, что это разные системы счисления: десятичная и шестнадцатеричная.

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

 Спасибо! Решение простое: в ресивере выставляем при печатании строки в компорт DEC, а от результата отнимаем '0'

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

Можно проще, переменную, которую выводите в сериал-монитор преобразуйте в char

Serial.print((char)data);

где data - переменная, которую выводите. И тогда функция Serial.print() бедет отправлять код АСКИ.
Или так:

Serial.write(data);