Связь Arduino по схеме «точка-точка» с RFM LoRa Shield

В < a href="https://cytrontechnologies.github.io/RFM-LoRa-Shield-Examples/Arduino-Sketches-Overview/">этом руководстве он отправляет строку из одного узла в другой узел. Но если я хочу отправить целое число вместо строки, как мне изменить код?

Serial.println("Sending to rf95_server");
// Отправить сообщение на rf95_server

String radiopacket = "Hello World #";
radiopacket += String(packetnum++);
radiopacket += " from ";
radiopacket += node_id;

Serial.print("Sending "); Serial.println(radiopacket); delay(10);
rf95.send((uint8_t*)radiopacket.c_str(), radiopacket.length()+1);

Serial.println("Waiting for packet to complete..."); delay(10);
rf95.waitPacketSent();

, 👍1

Обсуждение

Вы можете либо преобразовать его в текст (sprintf), либо отправить его в виде байтов. Как вам нравится. Как вы *хотите* его отправить?, @Majenko

Я хочу отправить данные, полученные с ультразвукового датчика. Как отправить данные в виде байта? Извините, я новичок в программировании., @Kelvin Chai

Я могу сказать... Данные — это просто данные, будь то строка или число. Это просто данные. int — это всего лишь два байта. Вы можете отправить его, приведя его к типу bytes (как вы уже делаете с существующим кодом) с размером 2 байта. Просто помните, что приводить его нужно с использованием адреса целого числа, а не его значения., @Majenko


2 ответа


1

Самый простой способ — просто преобразовать целое число в массив из 2 байтов и отправить его. Предположим, что int temperature:

rf95.send((uint8_t *)&temperature, 2);

Чтобы сделать его более переносимым, вы можете использовать размер целого числа вместо 2:

rf95.send((uint8_t *)&temperature, sizeof(int));

При обратном считывании вы просто преобразуете полученный буфер в целое число или объединяете данные вручную (что может быть безопаснее, поскольку буфер может быть не выровнен на более мощной системе, чем 8-битный Arduino):

int temperature = buf[0] | (buf[1] << 8);

(Предполагается, что он был отправлен из прямоугольной 8-битной системы).

Если вы хотите отправить число в виде обычного текста, чтобы его мог легко прочитать человек, вам нужно вывести его в строку:

char temp[6];
sprintf(temp, "%d", temperature);
rf95.send((uint8_t *)temp, strlen(temp));
,

спасибо за помощь, но я получил странный символ на стороне сервера . нужно ли мне что-то менять на стороне сервера, чтобы получить правильное целое число?, @Kelvin Chai

Да. Я сказал тебе, что нужно изменить., @Majenko

Обратите внимание, что бинарные методы "переносимы" только тогда, когда машины на обоих концах используют одинаковый размер переменной и порядок байтов, как это может быть в данном случае. В противном случае упаковку и распаковку нужно будет выполнять явно, например, как указано во многих сетевых протоколах. Это будет работать между двумя ATmega Arduino или двумя Due Arduino, но не между смешанной коллекцией без явной обработки., @Chris Stratton


0

Просто приведите целое число к строке перед отправкой и преобразуйте строку обратно в int при получении. Может быть не очень удобно для памяти, учитывая, что вы используете строки, но это очень просто.

int a = 10;
String s = String(a);

Затем вы можете отправить строку, как обычную строку. Затем на принимающей стороне вы преобразуете ее обратно в int.

Предполагаем, что вы получили строку s.

int b = s.toInt();
,