Как передать строковые данные с помощью библиотеки 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
!
!
!

Как мне теперь получить свое оригинальное сообщение?

, 👍2


1 ответ


Лучший ответ:

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