Преобразование string в unsigned long
- Войдите на сайт для отправки комментариев
Пнд, 19/05/2014 - 16:54
Всем доброго времени суток.
Столкнулся с проблемкой. На форуме ничего подобного не нашел.
Короче суть.
Имеется 2 arduino связанных между собой по радиоканалу с помощью Nrf24L01.
На одной из плат прикреплен ir передатчик.
Скетчи отправки данных из com порта adruinы 1 к другой работают. Проблема собственно в следующем:
Неоходимо реализовать отправку ir комманды вида Команда_ТипПротокола (0x20DFFF00_NEC).
Точнее с отправкой проблем нет. Проблема на стороне принимающей arduino:необходимо распарсить данную строку и передать код irsend.sendNEC(Команда, 32).
Может кто посоветует вообще другой способ?
На всякий случай скетчи:
// код №1 для передатчика
#include <SPI.h>
#include "RF24.h"
RF24 radio(9, 10);
const uint64_t pipes[2] = {0xF0F0F0F000LL, 0xF0F0F0F0FFLL};
void setup()
{
Serial.begin(9600);
radio.begin();
radio.setDataRate(RF24_250KBPS);
radio.setChannel(100);
radio.setRetries(15,15);
radio.openWritingPipe(pipes[1]);
radio.openReadingPipe(1, pipes[0]);
radio.startListening();
}
void loop()
{
if(Serial.available()){
char data[32] = "";
byte i = 0;
while(Serial.available()){
data[i] = Serial.read();
i++;
delay(2);
}
data[i] = 0;
radio.stopListening();
radio.write(&data, 32);
radio.startListening();
}
}
// код №2 для приёмника
#include <SPI.h>
#include "RF24.h"
#include <IRremote.h>
IRsend irsend;
RF24 radio(2, 3);
const uint64_t pipes[2] = {0xF0F0F0F000LL, 0xF0F0F0F0FFLL};
void setup()
{
Serial.begin(9600);
radio.begin();
radio.setDataRate(RF24_250KBPS);
radio.setChannel(100);
radio.setRetries(15,15);
radio.openReadingPipe(1, pipes[1]);
radio.startListening();
}
void loop()
{
if(radio.available())
{
char data[32] = "";
radio.read(&data,32);
/*
блок для разбора присланной команды
и ее дальнейшей отправки на ir передатчик
*/
}
}
поискав в инете нашел функцию strtoul
соотвественно дописал код:
// код №2 для приёмника #include <SPI.h> #include "RF24.h" #include <IRremote.h> IRsend irsend; RF24 radio(2, 3); const uint64_t pipes[2] = { 0xF0F0F0F000LL, 0xF0F0F0F0FFLL}; void setup(){ Serial.begin(9600); radio.begin(); radio.setDataRate(RF24_250KBPS); radio.setChannel(100); radio.setRetries(15,15); radio.openReadingPipe(1, pipes[1]); radio.startListening(); } void loop(){ if(radio.available()) { char data[32] = ""; radio.read(&data,32); String Protocol=""; char *Command=""; int pos=0; for(int i=0;i<sizeof(data);i++) { if(data[i]!='_') { Command[i]=data[i]; pos++; } else { break; } } for(int i=pos+1;i<=sizeof(data);i++) { if(data[i]!=NULL) { Protocol=Protocol+data[i]; } else { break; } } ///0x20DFFF00_NEC команда на включение телевизора LG unsigned long CommandLong = strtoul(Command,NULL,16);//преобразуем char в long irsend.sendNEC(CommandLong, 32); } }Но если выводить в Serial значение CommandLong(при отправке 0x20DFFF00_NEC) , то получается 551550735.
Если выводить как Serial.println(CommandLong,HEX), то получается 20DFFF00.
В итоге вопрос тот же что и в начале: как пребрзовать char вида 0x20DFFF00 в unsigned long вида 0x20DFFF00??????????
Странно перевелось
551550735 соответствует 0x20DFFF0F
И чем вас не устраивает strtoul?
Что вы понимаете под "unsigned long вида 0x20DFFF00"?
unsigned long v = strtoul("0x20DFFF00",0,16);
Serial.println(v);
Что выводит?
Таким образом выводит 0.
Попробуйте скормить функции строку без префикса "0x"
Пробовал и так, результат тотже - выдает 0.
unsigned long l = strtoul("0x20DFFF00",NULL, 16); lcd.print (l);только что проверил, вот это работает на ура, причем и без 0x тоже, результат - 551550720
Да все работает. Странно пробовал так ранее выводило не то что нужно. Странно.
Спасибо.