Связь 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();
@Kelvin Chai, 👍1
Обсуждение2 ответа
Самый простой способ — просто преобразовать целое число в массив из 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
Просто приведите целое число к строке перед отправкой и преобразуйте строку обратно в int при получении. Может быть не очень удобно для памяти, учитывая, что вы используете строки, но это очень просто.
int a = 10;
String s = String(a);
Затем вы можете отправить строку, как обычную строку. Затем на принимающей стороне вы преобразуете ее обратно в int.
Предполагаем, что вы получили строку s.
int b = s.toInt();
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Вы можете либо преобразовать его в текст (sprintf), либо отправить его в виде байтов. Как вам нравится. Как вы *хотите* его отправить?, @Majenko
Я хочу отправить данные, полученные с ультразвукового датчика. Как отправить данные в виде байта? Извините, я новичок в программировании., @Kelvin Chai
Я могу сказать... Данные — это просто данные, будь то строка или число. Это просто данные.
int
— это всего лишь два байта. Вы можете отправить его, приведя его к типу bytes (как вы уже делаете с существующим кодом) с размером 2 байта. Просто помните, что приводить его нужно с использованием адреса целого числа, а не его значения., @Majenko