Запись в массив из SerialPort

Тема в разделе "Arduino & Shields", создана пользователем ЯЯЯ, 29 ноя 2015.

  1. ЯЯЯ

    ЯЯЯ Нуб

    Подскажите, может быть кто-то сталкивался с подобным. Хочу записать в массив байтов (да хоть в любой) полученные символы в виде байтов через SerialPort.

    Т.е. я отправляю через терминал один за другим с минимальной временной задержкой два сообщения в виде символов(не байтов):

    "message 01 02 03 04 05

    message1 06 07 08 09 0A"

    В результате я хочу чтобы в одном массиве скажем array1 поместились бы 01 02 03 04 05

    а в другом array2 - 06 07 08 09 0A.

    Я думал о Serial.ParseInt, но в таком случае я не могу разделить байты, т.к. получается число 0102030405.

    Serial.Timeout тоже не сработает, т.к. сообщений много, они разной длинны и скорость передачи достаточно большая.
     
  2. seres

    seres Нуб

    Попробуй так:

    String inString = "";
    char inChar;

    if(Serial.available()) // Слушаем порт
    {
    inChar = Serial.read(); // Читаем символ
    inString = inString+inChar; // Переводим Char в String, набираем нужное кол-во символов

    if(inString.length()==2) // Поймали 2 символа
    {
    /* Заливаем в массив */
    inString=""; // Обнуляем строку
    }
     
  3. ЯЯЯ

    ЯЯЯ Нуб

    Спасибо, домой доберусь - попробую.
     
  4. ЯЯЯ

    ЯЯЯ Нуб

    Правда я теперь думаю, как в массив байтов все это засунуть, т.к. string не работает с массивами, только char...

    Разобрался вроде, inString.toInt()
     
  5. seres

    seres Нуб

    В тип массива вместо String подставляешь:
    char* A161[]={"","P51",,,,};
    все работает!!!
     
  6. seres

    seres Нуб

    Т.к. String - это и есть массив символов char!
     
  7. ЯЯЯ

    ЯЯЯ Нуб

    Спасибо за помощь, но честно говоря, это я не очень понял.

    Я написал так как ниже, но если отправить "4120" 5 раз например и прочитать, то ответ такой:
    41

    20


    4

    12

    0


    41

    20


    4

    12

    0


    41

    20

    Т.е. сначала ответ верный, потом какая-то лабуда. Вчера и сегодня ковырялся, ошибку найти не смог. В байтах выглядит так:
    34 31 0D 0A 32 30 0D 0A 0A 34 0D 0A 31 32 0D 0A 30 0A 0D 0A 34 31 0D 0A 32 30 0D 0A 0A 34 0D 0A 31 32 0D 0A 30 0A 0D 0A 34 31 0D 0A 32 30 0D 0A

    Т.е. лишняя 0A. Откуда берется - непонятно.

    String BUFFER[8];
    String inString = "";
    char inChar;

    void setup()
    {
    Serial.begin(115200);
    }

    void loop()
    {

    if(Serial.available()) // Слушаем порт
    {
    inChar = Serial.read(); // Читаем символ
    inString = inString+inChar; // Переводим Char в String, набираем нужное кол-во символов

    if(inString.length() == 2) // Поймали 2 символа
    {
    BUFFER[0] = inString;

    inString = ""; // Обнуляем строку

    Serial.println(BUFFER[0]);

    }}}
     
    Последнее редактирование: 1 дек 2015
  8. ЯЯЯ

    ЯЯЯ Нуб

    "Текстовые строки в Ардуино объявляются как массив (array) типа char (символов - литер), оканчивающийся символом "конца строки"."

    Отправил "41 20" и if(inString.length() == 3) и все заработало)
     
  9. Vetrinus

    Vetrinus Гик

  10. ЯЯЯ

    ЯЯЯ Нуб

    Да, пригодилось)
    Всем громадное спасибо, выручили!
     
  11. ЯЯЯ

    ЯЯЯ Нуб

    Еще подскажите, пожалуйста, как можно перевести строку в байты? Т.е. я отправляю 1A и хочу чтобы в массив попала 0x1A или 26.
    Можно стринг перевести в int, а потом в HEX, но при переводе в int A-F теряются и в итоге получает не 1A, а просто 1.
     
  12. Megakoteyka

    Megakoteyka Оракул Модератор

    http://cppstudio.com/post/816/
     
  13. ЯЯЯ

    ЯЯЯ Нуб

    Работает) Спасибо!