Как конвертировать String в Char или Byte array ?

Тема в разделе "Arduino & Shields", создана пользователем Jazzy, 13 май 2017.

  1. Jazzy

    Jazzy Нерд

    Всем добра и "прямого" кода!

    Подскажите, пожалуйста, как просто решить задачу такую вот:

    Отправляю с радиомодуля данные:
    Код (C++):
    String pot = String (144) + (60) + (PotVal);
        sendMsg(pot);
    На принимающей стороне получаю данные:
    И через монитор порта
    Код (C++):
    Serial.println(theMessage);
    вижу следующее:

    14460127

    Последнее значение PotVal плавающее(от 0 до 127).


    Необходимо разделить эти данные примерно следующим образом:

    Код (C++):
    void OUT(char 144, char 60, char (от 0 до 127))
     
  2. Jazzy

    Jazzy Нерд

    Может как-то "поинтеры" расставить на передающей стороне и по ним разделять уже на приёмнике..?
    И конечно не должно быть задержки)
     
  3. rkit

    rkit Гуру

    Посылаете сила и получаете числа. Перевод в строку лишний. Serial.write, Serial.read
     
  4. Jazzy

    Jazzy Нерд

    Был бы весьма признателен за более подробный ответ)

    То есть уже отправлять как char??
     
  5. mcureenab

    mcureenab Гуру

    у вас PotVal какого типа?

    В прочем не важно:
    На отправляющей стороне:
    Код (C++):
    Serial.write((char*)&PotVal, sizeof(PotVal) )
    На принимающей стороне

    Код (C++):

      char *p = (char*)&PotVal;
        for(uint8_t i = 0; i < sizeof(PotVal); ++i, ++p )
        {
            int b;
            while( -1 == ( b = Serial.read() ) ){};
            *p = b;
        }

     
     
  6. mcureenab

    mcureenab Гуру

    144 60 это маркер какой то постоянный?

    Тогда не перегоняйте эти числа в String. Просто посылайте три байта:

    Код (C++):
    Serial.write(144);
    Serial.write(60);
    Serial.write(PotVal);
    на принимающей стороне

    Код (C++):
    char arr[3];
      for( char *p = arr; p != &arr[3]; ++p )
      {
           int b;
           while(-1==( b = Serial.read())){};
           *p = b;
      }
     
    Jazzy нравится это.
  7. smile

    smile Нерд

    я конечно пока что ещё нуб и много чего не понимаю, но зачем так много кода, для отправки простых сообщений через nrf24?
    Там же всё просто должно быть!
    Объявили массив размером 3, считали из Serial в ячейки массива, отправили массив.
     
    Jazzy нравится это.
  8. mcureenab

    mcureenab Гуру

    Код (C++):
    unsigned char msg[3] = { 144, 60, 0};
    msg[2] = PotVal;
    radio.write(msg, 3);
     
    Andrey12, Jazzy и smile нравится это.
  9. smile

    smile Нерд

    Объясни что код должен делать.
     
  10. mcureenab

    mcureenab Гуру

    Прежде нужно последовательно прочитать символы 144, 60 и наконец mappedPotVal.
    1. Читаем 144. Если пришло 144 переходим к 2. Если пришло что то еще, переходим к 1.
    2. Читаем 60. Если пришло 60 переходим к 3. Если пришло 144, переходим к 2. Если пришло что то еще, переходим к 1.
    3. Читаем mappedPotVal. Делаем что надо. Переходим к 1
     
    Jazzy нравится это.
  11. smile

    smile Нерд

    Код (C++):

    #include <RF24.h>
    #include <SPI.h>

    int msg[3], mappedPotVal;

    RF24 radio(9,10);
    const uint64_t pipe = 0xE8E8F0F0E1LL;

    void setup(void){
      delay(1000); // для стабильности радио и uart
      Serial.begin(38400);
      radio.begin();
      radio.setDataRate(RF24_2MBPS);
      radio.setAutoAck(false);
      radio.openReadingPipe(1,pipe);
      radio.startListening();
    }

    void loop(void){
    if (radio.available()){
       radio.read(&msg, 3);
       if (msg[0] == 144){
         if (msg[1] == 60){
            mappedPotVal = msg[2];
        }
      }
    }
    elsЫ проставить как надо и готово... не? ))
     
  12. smile

    smile Нерд

    так и не понял, зачем в символы конвертить?
     
  13. smile

    smile Нерд

    ок, признаю, я не достаточно знаю язык, что бы тебе помочь, подожди пока более грамотные люди подскажут...
    Но всё же, мне кажется зря ты преобразуешь числа в символьный массив и потом передаешь его.
    Число 144 занимает 1 байт, символы числа 144 занимают 3 байта.
    unsigned char msg[3] = { 144, 60, 0}; и вот так вроде не правильно, 144 - это не символ, это строка, т.е. либо массив символов, либо string или char* ...

    Я пас.
     
    Jazzy нравится это.
  14. Jazzy

    Jazzy Нерд

    Помогайте кароче. Не сдюжу никак...
     
  15. mcureenab

    mcureenab Гуру

    unsigned char msg[3] это массив из 3 х маленьких чисел без знака. 144 - это число, "144" - это строка.
    число 144 можно сохранить в переменную типа unsigned char.
    для строки "144" нужен массив из 3х char плюс один char для терминирующего 0.
     
    smile нравится это.
  16. mcureenab

    mcureenab Гуру

    Для функции

    Код (C++):
    void MIDImessage(char command, char value1, char value2){
      Serial.write(command);
      Serial.write(value1);
      Serial.write(value2);
    нужно три числа, а у вас в радиосообщении только одно передается - PotVal. Два других как я понимаю передаются всегда и по сути ни чем управлять не могут, кроме как маркером в потоке данных.

    Из кода не понятно, куда PotVal в итоге должно попадать.
     
    Jazzy нравится это.
  17. smile

    smile Нерд

    Интересно!
    А число 144 в переменной типа char будет числом 144 или кодом какого-то символа?
    Если нет, то в чём тогда разница между unsigned char и unsigned int?
     
  18. rkit

    rkit Гуру

    Будет числом 144, кодирующим символ 'd'.
    char содержит не менее 8 бит, int содержит не менее 16 бит
     
  19. mcureenab

    mcureenab Гуру

    Для типа char, как и для многих других интегральных типов и определены арифметические операции и функции. Поэтому значение переменной типа char есть число.
    Код (C++):
    char a = 0;
    char b = a++;
    assert ( 0 == b && 1 == a );
    Значение char можно задать числом или символьным литералом (буквой в одинарных кавычках, например 'А' ). А массив char можно задать последовательностью чисел, символьных литералов или строковым литералом (цепочкой букв в двойных кавычках "ABC", и не забываем, что после цепочки символов к строковому литералу добавляется 0).

    Тут массивы a, b и c содержат одинаковые значения :

    Код (C++):
    char a[4] = "ABC";
    char b[4] = { 'A', 'B', 'C', '\0' };
    char c[4] = { 65, 66, 67, 0 }; // ASCII
     
    Для char и массивов char есть много символьных функций. Тип char создан для хранения и обработки символьных данных. Например isalpha проверяет, является ли значение символом алфавита в культурной среде. А putch выводит символ на терминал или принтер, где он обретает некое видимое начертание.
     
    smile и Jazzy нравится это.
  20. Jazzy

    Jazzy Нерд



    Да, два значения статичные, одно плавающее. Но я буду модифицировать код под отправку других статичных значений при других обстоятельствах "нажатия".

    PotVal должно попадать в value2