Использовать 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); не выдает никаких ошибок, но и, похоже, ничего не делает
@Johnny Derpp, 👍1
Обсуждение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
Библиотека, которую вы используете, и протоколы, которые она реализует, не предназначены для отправки больших объемов данных.
Используемая вами функция sendNEC просто ограничена 32 битами на передачу. Вы не сможете отправить с ним строку произвольной длины, за исключением построения вокруг нее некоторого протокола, который разбивает строку на несколько передач по 32 бита за раз.
Не вдаваясь в подробности о стандарте языка и не требуя, чтобы все было абсолютно точным: то, что вы делаете с вашим приведением (uint32_t)
, - это отправка адреса памяти вашей строки по IR, что, без сомнения, не то, что вы хотели, и, вероятно, не особенно полезно на принимающей стороне.
То, что вы, по-видимому, хотите, - это что-то более близкое к ИК-интерфейсу. Тем не менее, вы, вероятно, могли бы делать то, что хотите, вызывая sendNEC()
для каждого символа ваших данных в простом случае. Лучше было бы отправлять 32 бита строки за раз, поскольку каждая передача сопряжена с накладными расходами. Но опять же, эти функции и протоколы предназначены для отправки коротких, нечастых сообщений. Они были разработаны так, чтобы быть очень простыми, чтобы их можно было реализовать аппаратно с долей мощности обычного Arduino, чтобы они могли быть дешевыми десятилетия назад, когда их инвертировали. Стремясь быть одновременно простыми и хотя бы в какой-то степени надежными, они жертвуют большой скоростью.
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Использование VS1838B с Arduino
- Что лучше использовать: #define или const int для констант?
- Функции со строковыми параметрами
- Как работать с аналоговыми контактами в цикле?
- Какие есть другие IDE для Arduino?
- Как использовать переменные и функции в нескольких файлах .ino
- Разница между void setup() и void setup(void)
когда я пытаюсь ввести свою собственную переменную
... какая переменная? ... в чем его ценность?, @jsotolaпредупреждение: недопустимое преобразование из 'char*' в 'long unsigned int' [-fpermissive] irsend.sendNEC(buf, 32);
, @KIIVПытаюсь использовать buf. irsend.sendNEC(buf, 32); irsend.sendNEC((uint32_t) buf, 32); не работают добавил еще два предложения внизу, чтобы помочь прояснить ситуацию, @Johnny Derpp