IR через Ethernet. Конвертация данных
- Войдите на сайт для отправки комментариев
Добрый день!
Коллеги, подскажите как решить вопрос или где и о чем почитать, чтобы приблизиться к решению.
Суть вопроса такая. Пытаю сделать устройство для передачи ИК команд с одного контроллера на другой через Ehernet. Первый их передает(предварительно считанные с пульта посредством IRremote), второй принимает и отправляет на ик-эммитер. В качестве приемного устройства выступает Arduino nano + W5100.
У меня получилось это реализовать, если протокол команды с пульта (при считывании) распознался библиотекой IRremote и команда имеет вид "38863BD2". (как это реализовано покажу ниже) Проблема начинается, если при считываниее протокол не распознался и нужно отправлять RAW команду.
Работа с RAW в библиотеке на приемной строне выглядит так (например):
unsigned int rawData[] = {450,250, 200,250, 200,550, 200,400, 200,400, 200,250, 200,250, 200,250, 200,250, 200,550, 200,550, 250,400, 200,550, 200,400, 200,400, 250,350, 250,250, 200}; int khz = 38; irsend.sendRaw(rawData, sizeof(rawData) / sizeof(rawData[0]), khz);
Ну, думаю это и так вам известно! ))
Получается, что мне нужно отправить строку в виде "450,250, 200,250, 200,550 ... итд", принять ее и обработав превратить в массив INT. У меня получилось это сделать только при помощи цикла, но это неприемлемо долгий в обработке вариант и создает сильные задержки в работе.
Может кто подскажется как самым безболезненым образом превратить String SerialDataIn = "111,222,333,444" в int RawData [] = {111,222,333,444} ??
Читал и форум и гуглил...много разной информации есть, но так и не смог собрать в рабочий вариант...очень много нюансов, которые не могу понять! ))
Теперь о том, как сделал, если протокол при считывании распознался. Может быть есть варианты как-то оптимизироваться (хотя, относительно быстро работает)
void loop(){ // Create a client connection EthernetClient client = server.available(); if (client) { while (client.connected()) { if (client.available()) { char c = client.read(); //read char by char HTTP request if (readString.length() < 200) { readString +=c; } //Serial.println(readString); //if HTTP request has ended if (c == '\n') { serialDataIn = String(""); startIRcode = readString.indexOf('='); //находим позицию начала команды endIRcode = readString.indexOf('!'); //находим позицию окончания команды irprotocol = readString.substring(startIRcode-3,startIRcode); //вытаскиваем из строки протокол serialDataIn = readString.substring(startIRcode+1,endIRcode); //вытаскиваем из строки команду constcomm = serialDataIn.c_str(); //конвертация String в const char для работы strtoul IRcomm = strtoul(constcomm,NULL, 16); //преобразование из текста в HEX //отправляем команду digitalWrite(STATUS_PIN, HIGH); if (irprotocol == "NEC") { irsend.sendNEC(IRcomm, 32);} digitalWrite(STATUS_PIN, LOW); Serial.println("Sent IR signals from LED at Pin 3 (PWM)"); client.println("HTTP/1.1 200 OK"); //send new page client.println("Content-Type: text/html"); client.println(); //stopping client client.stop(); readString=""; serialDataIn = String(""); counter=0; } } } } }
Команду я отправляю в виде "GET /NEC=38863BD2! HTTP/1.1 HOST: 192.168.1.223 \0D\0A"
А сколько миллисекунд сейчас занимает обработка? Вы уверенеы что задержка именно в обработке, а не в передаче по интернету?
Честно говоря, я не знаю как в этой среде посмотреть время .. Я ориентируюсь на время вывода результата в монитор порта ... команда принимается быстро, а вот обработка команды (если делать циклом, как я говорил) ..ммм..секунда+-. Я думаю это вполне логично, кучу символов перебрать по одному.
Интуиция подсказывает, то наверняка есть спобобы конвертации char массива в int массив без использования (во всяком случае явного) цикла... просто, его нужно найти. ДУмаю, спецы по СИ++ должны знать!
Интуиция подсказывает, то наверняка есть спобобы конвертации char массива в int массив без использования (во всяком случае явного) цикла... просто, его нужно найти. ДУмаю, спецы по СИ++ должны знать!
вы бы код своего цикла показали - сдается. что дело там совсем не в обработке символов.
Вставьте эту строчку перед началом цикла и после и посмотрите какие числа в мониторе выведет.
Вот такая ерунда из разряда "решение в лоб" на уно прокручивается за 3,4мс. Я сомневаюсь что у Вас там намного больше (если вообще больше) и сомневаюсь что там на глаз заметно будет :)
Вы правы оказались ... ))) я правда не понял где у меня была ошибка, потому как даже мой вариант заработал приемлемо!))
По измерениям получилось 7-10мс от момента получения пакета до отправки на ИК. Не идеальное время, но с ним уже можно жить!))