Преобразование string в unsigned long

NEGr
Offline
Зарегистрирован: 12.05.2014

Всем доброго времени суток.

Столкнулся с проблемкой. На форуме ничего подобного не нашел.

Короче суть.

Имеется 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 передатчик
  */
  }
}

 

 

NEGr
Offline
Зарегистрирован: 12.05.2014

поискав в инете нашел функцию 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??????????

 

 
Geronimo
Offline
Зарегистрирован: 06.05.2013

Странно перевелось
551550735 соответствует 0x20DFFF0F

Geronimo
Offline
Зарегистрирован: 06.05.2013

И чем вас не устраивает strtoul?
Что вы понимаете под "unsigned long вида 0x20DFFF00"?
unsigned long v = strtoul("0x20DFFF00",0,16);
Serial.println(v);
Что выводит?

NEGr
Offline
Зарегистрирован: 12.05.2014

Таким образом выводит 0.

 

toly
Offline
Зарегистрирован: 17.05.2014

Попробуйте скормить функции строку без префикса "0x"

 

 

NEGr
Offline
Зарегистрирован: 12.05.2014

Пробовал и так, результат тотже - выдает 0.

toly
Offline
Зарегистрирован: 17.05.2014
unsigned long l =  strtoul("0x20DFFF00",NULL, 16);
  
lcd.print (l);

только что проверил, вот это работает на ура, причем и без 0x тоже, результат - 551550720

 

NEGr
Offline
Зарегистрирован: 12.05.2014

Да все работает. Странно пробовал так ранее выводило не то что нужно. Странно.

Спасибо.