serial port

Тема в разделе "Arduino & Shields", создана пользователем Frozen, 3 окт 2013.

  1. Frozen

    Frozen Нерд

    Подскажите как отправить данные вида ключ значение на ардуино по serial port
     
  2. Megakoteyka

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

    Преобразовать в массив байт и отправить :) В чем проблема?
     
  3. NR55RU

    NR55RU Гик

    Megakoteyka, нет тут все сложнее, человек сейчас стоит на тех же граблях на которых стоял я сам когда после PHP начал изучать Си и вообще углубляться в познаниях ПК.

    Супер краткий курс о данных.
    Любые данные в любом цифровом электронном устройстве хранятся лишь как 0 и 1.
    Если мы возьмем к примеру число 1000110 что это ? да это ВСЕ ЧТО УГОДНО, это может быть буква, число, или любое слово или даже целая фраза, все зависит от того как мы с вами договоримся кодировать данные. То есть по сути это просто комбинация нулей и единиц которая может быть интерпретирована как мы пожелаем.
    И все цифровые электронные устройства обмениваются именно набором 0 и 1, они не обмениваются массивами или буквами, только НОЛЬ и ОДИН.
    Данные в памяти не лежат в качестве каких то строк, память это лишь набор ячеек для 0 и 1 и строка это лишь последовательный набор ячеек где в каждой ячейке хранится набор 0 и 1 которые мы должны интерпретировать как некий символ, или можем интерпретировать его как душе угодно (для этого в языках у переменных требуется указывать тип данных что бы компилятор знал как ему интерпретировать этот набор 0 и 1 в PHP интерпретатор все это скрывает), ПК вообще не знает таких понятий как символы, и когда вы видите символ на экране это всего навсего битовая матрица какие пиксели надо закрасить на экране согласно некому набору 0 и 1, для ПК есть только два числа 0 и 1 .. остального для него прост не существует.
    Таким образом строку можно считать набором или массивом символов которые последовательно размещены в памяти. и ТО заметь те это лишь договоренность что мы будем хранить строчки именно так.

    И так как мы выяснили что передать массивы в том привычном для вас виде что вы привыкли использовать в PHP например уже нельзя, ибо тут мы имеем дело с низкоуровневыми данными а не с данными внутри программы, там компилятор или интерпретатор скрывает все эти заморочки.

    И так как же вам все же массив то передать, ну есть два пути.
    1. Может быть кто то написал некую библиотеку, которая сможет взять набор символов и распарссит в привычный для вас массив. Пример функции serialize() и unserialize() в PHP которая может превратить массив в строку а потом из строки опять в массив.

    2. Самому определить некий протокол и отправлять данные на ардуин а на ардуине уже эти данные согласно своей собственной договоренности переделать в массив. Например вы можете отправить два блока данных первый: 10 второй 13400 .. на ардуине уже интерпретировать первый блок данных как ключ массива 10 а второй 13400 как значение массива с этим ключем. И вот так один за одним передавать и парсить это к примеру.

    И советую прислушатся к совету Megakoteyka который он вам дал темой рание, вы пришли в область которая имеет немного другие понятия чем PHP и JS, что бы тут что то делать надо иметь хотя бы базовые понятия более низкоуровневые, посему прислушайтесь к его совету, он знает что говорит поверьте :)

    P.s. Если вдруг я где выше в чем то ошибся, то более опытные участники форма надеюсь меня поправят.
     
    Последнее редактирование: 4 окт 2013
    atompost и Unixon нравится это.
  4. Megakoteyka

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

    Человек не знает и не хочет изучать С/С++ и разбираться, а вместо этого ищет готовое решение.
    При этом не может даже четко сформулировать вопрос.
    Это как спросить "как запрограммировать робота?".
    Чтобы получить хороший ответ, нужно сперва задать хороший вопрос :)
     
  5. NR55RU

    NR55RU Гик

    Ясно, человеку не нужна удочка, человек хочет рыбу :)
     
  6. Frozen

    Frozen Нерд

    Вы зря так говорите. Если бы я хотел просто игрушку, я бы купил игрушку. Я как раз ХОЧУ в этом разобраться, но сейчас я уперся в стену, которую не могу пройти. Естественно я пытаюсь идти по пути наименьшего сопротивление, и пытаюсь найти готовое решение.
    Черт возьми да! я не могу сформулировать вопрос, я пытаюсь это сделать.
    Конечно ответ иди учи С/С++ это вообще универсальный ответ. Такой ответ всегда имеет место быть. Но для чего тогда форум!? Объясните мне если я чего то не понимаю.
     
  7. Frozen

    Frozen Нерд

    Огромное спасибо NR55RU за сочувствие к дилетантам. Ваше сообщение было очень полезным.
    Благодаря ему я могу переформулировать вопрос.
     
  8. Frozen

    Frozen Нерд

    Отправляю данные по сериал вида "123"
    Как их распарсит на ардуино и превести к виду
    int a = "1";
    int b = "23"
     
  9. Megakoteyka

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

    Прежде всего не надо отправлять данные вида "123".
    Отправляйте данные вида "1,23" - используйте разделитель.
    Далее. Предположим, вы отправляете несколько пакетов. получается "1,231,231,231,231,23".
    По дороге испортился один байт и Вы его не приняли. В итоге получили: 1,21,231,231,23...".
    Как понять, какой байт потерян? А если первое число может быть различной длины, как и второе (что обычно и встречается на практике? Дополнять нулями спереди можно, но нехорошо.
    Хорошо сделать пакетный протокол - сперва идет стартовый символ, затем длина пакета в байтах, затем байты пакета. Тогда на приеме Вы всегда сможете определить неверно принятый пакет и отбросить его.
     
  10. Megakoteyka

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

    А на php можете распарсить? Только без использования регулярных выражений, а исключительно своим кодом.
    З.Ы.: Форум нужен для решения хотя бы мало-мальски нестандартых задач и обмена опытом, а не для задавания вопросов, на которые уже было отвечено сотни раз. Вы же вэб-разработчик, не мне Вас учить пользоваться поиском. Или в гугле забанили? ;)
     
  11. Unixon

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

    Код (Text):
    char *readSerialString(const char BeginChar, const char EndChar, const int MaxLength, const unsigned long Timeout)
    {
    const unsigned long time_start = millis();
    char *buf = new char[MaxLength];
    int pos = 0, count = 0;
    bool message = false;
    while (true)
    {
      if (Serial.available())
      {
      char c = Serial.read();
      if (message)
      {
        buf[pos++] = c;
        buf[pos] = 0;
      }
      else if (c==BeginChar)
      {
        pos = 0;
        message = true;
      }
      else if (c==EndChar)
      {
        message = false;
        break;
      }
      count++;
      }
      if ((pos+1)>=MaxLength)
      {
      buf[pos] = 0;
      break;
      }
      if ((millis()-time_start)>Timeout)
      {
      break;
      }
    }
    if (0==count)
    {
      delete[] buf;
      buf = 0;
    }
    return buf;
    }
     
    Последнее редактирование: 4 окт 2013