Использовать irsend с тем, что является char* , но он этого не примет. Как преобразовать его в то, что ему нужно?

Я пытаюсь использовать Raspberry pi для отправки ИК-кодов непосредственно на мой arduino, чтобы иметь как можно более простую программу на языке Си. Вот мой код, с которым я возился, который приводит к ошибкам или не работает, если я специально не жестко кодирую шестнадцатеричный ИК-сигнал.

#include <IRremote.h>

char buf[80];

String code = "empty";

int readline(int readch, char *buffer, int len) {
  static int pos = 0;
  int rpos;

  if (readch > 0) {
    switch (readch) {
      case '\r': // Ignore CR
        break;
      case '\n': // Return on new-line
        rpos = pos;
        pos = 0; // Reset position index ready for next time
        return rpos;
      default:
        if (pos < len-1) {
          buffer[pos++] = readch;
          buffer[pos] = 0;
        }
    }
  }
  return 0;
}


void setup() {
  Serial.begin(115200);
}

IRsend irsend;

void loop() {
  if (readline(Serial.read(), buf, 80) > 0) {
    Serial.print("You entered: >");
    //Serial.print(buf);
    //Serial.println("<");
    //irsend.sendNEC((uint32_t) buf, 32);
    String str(buf);
    //irsend.sendNEC((uint32_t) code, 32);
    //irsend.sendNEC(0x210704FB, 32);
    code = buf;
    delay(600);
    //Serial.print((uint32_t) buf, 32);
    Serial.print(code);
    irsend.sendNEC(buf, 32);
    
  }

Я оставил свой беспорядок внизу, чтобы проиллюстрировать, как мало я знаю и что я пробовал. Я пытался понять, что я отправляю, но это не помогает, что serial.print не работает так, как irsend. Я намереваюсь напрямую отправлять шестнадцатеричные коды и заставить arduino вслепую подключать их к irsend.sendNEC(0x210704FB, 32); что работает, но когда я пытаюсь ввести свою собственную переменную, это не работает.

Очень ценю любую помощь! Я знаю, что это было бы легко для любого, кто немного знает К.

irsend.sendNEC(buf, 32); возвращает: инициализация аргумента 1 'void IRsend::sendNEC(uint32_t, uint8_t, bool)' аннулирует отправку (uint32_t данных, uint8_t nbits, bool repeat = false);

и irsend.sendNEC((uint32_t) buf, 32); не выдает никаких ошибок, но и, похоже, ничего не делает

, 👍1

Обсуждение

когда я пытаюсь ввести свою собственную переменную ... какая переменная? ... в чем его ценность?, @jsotola

предупреждение: недопустимое преобразование из 'char*' в 'long unsigned int' [-fpermissive] irsend.sendNEC(buf, 32);, @KIIV

Пытаюсь использовать buf. irsend.sendNEC(buf, 32); irsend.sendNEC((uint32_t) buf, 32); не работают добавил еще два предложения внизу, чтобы помочь прояснить ситуацию, @Johnny Derpp


2 ответа


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

2

Если вы отправляете шестнадцатеричные значения, такие как 0x1234abcd, из Pi в Arduino, чтобы отправить их в виде ИК-кода, вам сначала нужно интерпретировать эти строковые данные как шестнадцатеричное число.

Это не так просто, как просто привести строку, поскольку, как говорит @timemage, все, что вы там делаете, - это приведение адреса массива символов.

Вместо этого вы должны использовать strtoul() для синтаксического анализа строки и дать вам число, эквивалентное тому, что она содержит.

strtoul() может преобразовывать числа в несколько различных оснований и даже может работать автоматически. Со справочной страницы Linux:

СИНОПСИС

unsigned long int strtoul(const char *nptr, char **endptr, int base);

И далее:

Если основание равно нулю или 16, строка может затем включать префикс "0x", и число будет считываться с основанием 16; в противном случае нулевое основание принимается за 10 (десятичное), если следующий символ не равен "0", и в этом случае оно принимается за 8 (восьмеричное).

Это означает, что он может автоматически анализировать 0x1234abcd как шестнадцатеричное число, 12345678 как десятичное число и 052714 как восьмеричное число (важно помнить об этом, чтобы вы случайно не добавили начальный ноль к десятичному числу и не проанализировали его неправильно).

Итак, зная все, что вы можете сейчас:

uint32_t code = strtoul(buffer, NULL, 0);

и код будет содержать содержимое буфера, представленное в виде фактической числовой переменной (при условии, что содержимое может быть проанализировано как число).

,

Это работает! Большое вам огромное спасибо. Я думаю, что это последний бит C, который мне был нужен для этого проекта. Я очень ценю вашу помощь. Это для дистанционного управления телевизором моей матери, пока я на работе. У нее слабоумие, и она находится на том этапе, когда она откажется от телевизора и будет сидеть в тишине весь день, и к тому времени, как я вернусь, чтобы проведать ее, в ее голове появляется множество страшных мыслей. С обычным кабельным телевидением она всегда заканчивает просмотром новостей, и в своем состоянии она чувствует искреннее смятение и страх и спускается по спирали вниз. Вы нам так сильно помогли., @Johnny Derpp


1

Библиотека, которую вы используете, и протоколы, которые она реализует, не предназначены для отправки больших объемов данных.

Используемая вами функция sendNEC просто ограничена 32 битами на передачу. Вы не сможете отправить с ним строку произвольной длины, за исключением построения вокруг нее некоторого протокола, который разбивает строку на несколько передач по 32 бита за раз.

Не вдаваясь в подробности о стандарте языка и не требуя, чтобы все было абсолютно точным: то, что вы делаете с вашим приведением (uint32_t), - это отправка адреса памяти вашей строки по IR, что, без сомнения, не то, что вы хотели, и, вероятно, не особенно полезно на принимающей стороне.

То, что вы, по-видимому, хотите, - это что-то более близкое к ИК-интерфейсу. Тем не менее, вы, вероятно, могли бы делать то, что хотите, вызывая sendNEC() для каждого символа ваших данных в простом случае. Лучше было бы отправлять 32 бита строки за раз, поскольку каждая передача сопряжена с накладными расходами. Но опять же, эти функции и протоколы предназначены для отправки коротких, нечастых сообщений. Они были разработаны так, чтобы быть очень простыми, чтобы их можно было реализовать аппаратно с долей мощности обычного Arduino, чтобы они могли быть дешевыми десятилетия назад, когда их инвертировали. Стремясь быть одновременно простыми и хотя бы в какой-то степени надежными, они жертвуют большой скоростью.

,