Как сортировать данные

Danila52
Offline
Зарегистрирован: 13.12.2012
Есть скетч приема на модуле 433Mhz RF link
#include <VirtualWire.h>
 
int RF_RX_PIN = 9;
// int incomingByte = 0;   // переменная для хранения полученного байта 
void setup()
{
  Serial.begin(9600);
  //Serial.println("setup");
  vw_set_rx_pin(RF_RX_PIN);  // Setup receive pin.
  vw_setup(200); // Transmission speed in bits per second.
  vw_rx_start(); // Start the PLL receiver.
}
 
void loop()
{
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  if(vw_get_message(buf, &buflen)) // non-blocking I/O
  {
    int i;
    digitalWrite(10, true); // Flash a light to show received good message
    // Message with a good checksum received, dump HEX
    Serial.print(" ");
    for(i = 0; i < buflen; ++i)
    {
      Serial.print(buf[i], HEX);
      Serial.print(" ");
    }
    Serial.println("");
    digitalWrite(10, false);
    }
}
Модуль принимает данные: 4 числа "31","32","33","34"
Как их различить и зажечь светодиоды соответственно последней цифре?
Читал учебник, разные типы данных их преобразования.
Пробовал по разному, ничего не получается.



 

maksim
Offline
Зарегистрирован: 12.02.2012

1. Почему и зачем соответственно последней цифре??? "31","32","33","34"
2. Плохо читали или не тот учебник читали.

"31","32","33","34" вы выводите в 16-тиричном представлении, если эти числа представить в 10-тичном виде, то это числа 49, 50, 51, 52, что соответствует кодам ASCII символов 1, 2, 3 и 4 соответственно.

а значит если вы хотите получить число, то нужно делать так

Serial.print(buf[i]-48, DEC);
Serial.print(" ");

если же хотите все так же символ, то так

Serial.print((char)buf[i]);
Serial.print(" ");

или так

char buf[VW_MAX_MESSAGE_LEN];
....
....
....
Serial.print(buf[i]);
Serial.print(" ");

 

Danila52
Offline
Зарегистрирован: 13.12.2012

Почему 31 и так далее. По задумке все равно, лишь бы различались состояния.Конечный итог: должен  быть включен светодиод на каждом числе,то есть если 31 -один вывод,32 -другой и так далее.А какие там числа, не очень важно. Проще  надо различить четыре состояния, Далее пойдут исполнительные  штучки.Вот на этой сортировке я и сломался ,Как сунуть в код "if ........=31,то делать одно. если "if.....=32, то другое. Вот это "......." не понятно

 

 

maksim
Offline
Зарегистрирован: 12.02.2012

Так в чем проблема? так и "всунуть":

#include <VirtualWire.h>
 
int RF_RX_PIN = 9;
// int incomingByte = 0;   // переменная для хранения полученного байта 
void setup()
{
  Serial.begin(9600);
  //Serial.println("setup");
  vw_set_rx_pin(RF_RX_PIN);  // Setup receive pin.
  vw_setup(200); // Transmission speed in bits per second.
  vw_rx_start(); // Start the PLL receiver.
}
 
void loop()
{
  int8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  if(vw_get_message(buf, &buflen)) // non-blocking I/O
  {
    int i;
    digitalWrite(10, true); // Flash a light to show received good message
    // Message with a good checksum received, dump HEX
    Serial.print(" ");
    for(i = 0; i < buflen; ++i)
    {
      if(buf[i] == '1') 
      {
        // делаем что-то
      }
      else if(buf[i] == '2') 
     {
       // делаем что-то
     } 
     else if(buf[i] == '3') 
     {
       // делаем что-то
     } 
     // и т.д.
      Serial.print(buf[i]);
      Serial.print(" ");
    }
    Serial.println("");
    digitalWrite(10, false);
    }
}

но лучше воспользоваться оператором switch case

Danila52
Offline
Зарегистрирован: 13.12.2012

Сейчас скажу крамольную мысль.Теоритически знал, на практике пробовал, но нет знания , как-бы сказать. связывать в общую программу, так ничего и не получилось.Вот беру if , а дальше в скобках.и переменных запутался.В общем учиться надо.Хотя теперь с вашей помощью передам сигнал "Включить первую лампу" со звуковым ответом "Выполняю.Включаю первую позицию". Спасибо за помощь