Читаем с UART. Как лучше?

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем ИгорьК, 15 апр 2016.

  1. ИгорьК

    ИгорьК Оракул Модератор

    Последние новости.
    1. На geektimes уважаемый пользователь Smart Alex написал восхитительную заметку о невероятных достоинствах этого модуля. Причем, как всегда, бесплатно. Всем заинтересованным читать здесь.
    2. К сожалению, эта заметка устарела, поскольку производитель (ума не приложу, почему он так решил :) ) изменил протокол, и добавил к нему стартовый и стоповый байт.
    Новое руководство и прошивка прилагаются.
     

    Вложения:

    Последнее редактирование: 20 апр 2016
  2. ИгорьК

    ИгорьК Оракул Модератор

    Еще раз пример работы с Serial:
    Код (Javascript):
    var cmd="";
    Serial1.setup(9600/*baud*/);
    Serial1.on('data', function (data) {
      Serial1.print(data);
      cmd+=data;
      var idx = cmd.indexOf("\r");
      while (idx>=0) {
        var line = cmd.substr(0,idx);
        cmd = cmd.substr(idx+1);
        var s = "'"+line+"' = "+eval(line);
        print(s);
        Serial1.println(s);
        idx = cmd.indexOf("\r");
      }
    });
    В этом примере var cmd - глобальная переменная.

    Если у меня три устройства сидят на разных портах - мне нужно три, или более, в зависимости от ситуации, глобальных переменных, которые, с другой стороны, нигде, кроме как внутри Serial.on не используются.

    Подскажите, пожалуйста, есть ли способы убрать эти переменные из глобальной области?
     
  3. Tomasina

    Tomasina Сушитель лампочек Модератор

    а они нужны все три одновременно? Заменить одной не выйдет?

    И почему глобальные, если "нигде, кроме как внутри Serial.on не используются."

    Как вариант - вынести работу с Serial.on в отдельную функцию (либо обернуть фигурными скобками), тогда при выходе из функции (или за пределы скобок) зарезервированная память освобождается.
     
  4. ИгорьК

    ИгорьК Оракул Модератор

    Нужны. Вы спрашивали чем JS лучше? В том числе и асинхронным кодом. Если на два UART придут одновременно два события - не нужно думать как с ними управляться. Они пойдут каждое по своей колее. Безусловно, для каждого UART нужна своя переменная, а (иногда) несколько, если, например, одновременно с чтением идет анализ на что-то.
    Они объявлены за пределами. Внутри - не возможно.
    Не прокатывает - ее придется все время вызывать. А так - она работает сама.
    Это не Си. Это JS. Здесь свои правила видимости переменных. Очень, надо сказать, прикольные.
     
  5. ИгорьК

    ИгорьК Оракул Модератор

    Дык... вот оно, все просто:
    Код (Javascript):
    Serial1.setup(9600/*baud*/);
    Serial1.cmd="";

    Serial1.on('data', function (data) {
      Serial1.print(data);
      Serial1.cmd+=data;
      var idx = Serial1.cmd.indexOf("\r");
      while (idx>=0) {
        var line = Serial1.cmd.substr(0,idx);
        Serial1.cmd = Serial1.cmd.substr(idx+1);
        var s = "'"+line+"' = "+eval(line);
        print(s);
        Serial1.println(s);
        idx = cmd.indexOf("\r");
      }
    });