Проблема с клавиатурой Arduino и радиочастотным передатчиком 433 МГц

Итак, основная идея заключается в том, что пользователь нажимает клавишу на клавиатуре, и нажатая клавиша отправляется радиочастотным передатчиком. У меня работают отдельные части (клавиатура и передатчик), но я не могу отправить сам ключ. Когда я пытаюсь отправить его, я получаю странную строку на другом конце. Я убежден, что это простая проблема с моим синтаксисом, поэтому, если бы кто-нибудь мог мне помочь, это было бы здорово. Код ниже:

#include <RH_ASK.h>
#include <SPI.h> // На самом деле не используется, но необходим для компиляции
RH_ASK driver; //используем этот драйвер для передатчика



#include <Keypad.h>
const byte ROWS = 4; //четыре строки
const byte COLS = 4; //четыре столбца
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {10, 9, 8, 7}; //подключаемся к распиновке ряда клавиатуры
byte colPins[COLS] = {6, 5, 4, 3}; //подключаем к колонке распиновку клавиатуры

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );



void setup()
{
    Serial.begin(9600);   // Только отладка
    if (!driver.init())
         Serial.println("init failed");
}

void loop()
{

    char key = keypad.getKey();

    if (key){
      Serial.println(key);//выводит правильный ключ
      //часть передатчика
// const char *msg = "Привет, мир!";
      const char *msg = key;//вот проблема, когда я отправляю строку выше, она работает нормально, когда я отправляю это, я получаю странную строку на другом конце
      driver.send((uint8_t *)msg, strlen(msg));
      driver.waitPacketSent();
      Serial.println(key);//выводит правильный ключ
      Serial.println("packet_sent");
    }
}

, 👍3

Обсуждение

В библиотеке VirtualWire (неиспользуемые) контакты назначаются определенным контактам. Вы можете проверить исходный код библиотеки RadioHead, какие контакты используются по умолчанию, или вы можете установить все возможные контакты, которыми может управлять RadioHead, на неиспользуемые контакты., @Jot

Сэр, не могли бы вы поделиться дополнительной программой ресивера?, @Ihtesham Khan


1 ответ


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

3

Проблема в том, что вы отправляете символ типа char, то есть ровно один байт. Однако, когда вы отправляете его, вы должны указать длину и использовать strlen. Однако msg — это массив (по крайней мере, это то, что вам нужно), но этот массив содержит только отправляемый символ. Вам нужно отправить только 1 символ, поэтому используйте 1 вместо strlen.

Кроме того, вы можете избавиться от специального указателя msg и вместо

  const char *msg = key;//вот проблема, когда я отправляю указанную выше строку, она работает нормально, когда я отправляю это, я получаю странную строку на другом конце
  driver.send((uint8_t *)msg, strlen(msg

использовать

  driver.send(&key, 1);

Где &key определяет адрес (указатель на) ключа, а поскольку в ключе всегда ровно 1 байт (сам ключ), можно использовать 1. Чтобы быть более безопасным, вы можете использовать sizeof(key) таким образом

  driver.send(&key, sizeof(key));

Вы также можете создать строку, оканчивающуюся на \0, так что первым будет символ для отправки, и можно использовать strlen, но проще всего установить длину ровно 1.

На самом деле использование strlen для строки, которая не заканчивается на \0, может привести к странному поведению, поскольку, возможно, в памяти нет символа \0.

,

Спасибо за ваш ответ, я попробовал оба решения (только «1» и sizeof), и это приблизило меня к решению. С другой стороны, я получаю «1k⸮⸮⸮******8», когда значение ключа равно 1, «2k⸮⸮⸮******8» для 2 и так далее. Еще раз извините за то, что вам нужно быть в руках, но как PHP-программист, для меня это совершенно новый мир :), @Milos Tosic

Нет проблем, я думаю, что запись в порядке, но, возможно, там, где вы ее читаете (где вы получаете пакет), вы должны сделать то же самое... Если другая сторона ожидает строку с нулевым завершением, попробуйте отправить строку из 2 символов, первое — это значение клавиатуры, второе — пустая строка, а длина отправки равна 2. Однако, поскольку первый символ правильный, я думаю, вы можете просто прочитать ровно 1 символ (это тот символ, который вам нужен). Часть k⸮⸮⸮*****8 — это просто некоторая случайная память, которая не записывается, поскольку буфер составляет всего 1 байт., @Michel Keijzers

Вы были правы, я обновил код приемника, и теперь он работает правильно. Спасибо за вашу помощь!, @Milos Tosic

Пожалуйста, удачи в вашем проекте, @Michel Keijzers