Как передать строковые данные с помощью библиотеки rc-switch?
Я использую библиотеку rc-switch для отправки и получения данных. В библиотеке rcswitch нет метода для отправки строковых данных. Я использую следующий метод для отправки строкового сообщения в буфере символов.
send_string("Hello World!");
---------------------------
void send_string(const char *str)
{
int i = 0;
for (char *p = str; *p; p++ ) {
mySwitch.send((i<<8) + *p, 16);
i++;
}
mySwitch.send((i<<8) + 255, 16);
}
И я получаю, используя этот встроенный метод Serial.print((char)mySwitch.getReceivedValue());. Но я получаю это сообщение.
H
H
H
e
e
e
l
l
l
l
l
l
o
o
o
W
W
W
o
o
o
l
l
l
d
d
d
!
!
!
Как мне теперь получить свое оригинальное сообщение?
@Chayan Mistry, 👍2
1 ответ
Лучший ответ:
Протокол связи, используемый этой библиотекой, ненадежен. Таким образом, каждое кодовое слово отправляется несколько раз, 10 раз default. Одним из решений этой проблемы является отправка «номер байта» вместе с каждым байтом, который вы передаете. Затем вы бы передавать 16-битные слова, где MSB (старший байт) — это байт число, а LSB — это фактический байт, который вы хотите передать. Что-то вот так:
int i = 0;
for (char *p = str; *p; p++) {
mySwitch.send((i<<8) + *p, 16);
i++;
}
О, подождите! Это именно то, что вы уже делаете! Так что, похоже, вы уже знаете об этой проблеме и даже внедрили решение. Почему же тогда вы задаете этот вопрос?
Хорошо, я буду считать, что вы просто забыли нам об этом сообщить. фрагмент кода выше не от вас, и вы даже не понять, что он делает. И вы также забыли предоставить ссылку на исходный код. Пожалуйста, в следующий раз прочтите Как мне задать хороший вопрос вопрос? прежде чем задать, и предоставьте всю соответствующую информация прямо в вопросе.
Теперь проблема в стороне чтения. Вам нужно использовать эти байты числа для удаления дубликатов. Одно (непроверенное) решение может выглядеть вот так:
// Возвращает полученный байт или -1, если ни один из них недоступен.
int receivedValue()
{
if (!mySwitch.available()) // нет доступных байтов
return -1;
static uint8_t last_byte_number = 0xff;
uint16_t code = mySwitch.getReceivedValue();
uint8_t this_byte_number = code >> 8;
if (last_byte_number == this_byte_number) // это дубликат
return -1;
last_byte_number = this_byte_number;
return code & 0xff; // LSB — это байт для возврата
}
И вы можете использовать его для печати данных на последовательном мониторе, как здесь:
int c = receivedValue();
if (c != -1) // если мы действительно получили новый байт
Serial.write(c);
- Вызов метода в основном скетче из библиотеки.
- Как читать и записывать EEPROM в ESP8266
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
- ошибка: espcomm_upload_mem failed при загрузке скетча
- Как определить размер Flash?
- Невозможно преобразовать «String» в «uint8_t {aka unsigned char}» при инициализации
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Несколько клиентских серверов через Wi-Fi