Не корректно работает Serial.pfush();

Тема в разделе "Arduino & Shields", создана пользователем freelancer89, 26 фев 2012.

  1. freelancer89

    freelancer89 Нуб

    Доброго времени суток. Только вчера получил посылкой ардунку. Начал сразу осваивать ее по видеороликам. Изучаю 6 серию. Столкнулся с проблемой, что когда по сериал соединению на ардуино посылаю "пачку мусора", то ардуино обрабатывает каждый символ, хотя я использую Serial.flush(). Думал что с кодом напортачил, скачал исходный код урока, загрузил скетч и тот-же самый результат.Подскажите, в чем может быть проблема?

    ОС: Ubuntu 10.04 (Lucid Lynx).
    Arduino: Arduino Uno R3.
     
  2. nailxx

    nailxx Официальный Нерд Администратор

    Добрый!

    Дело не в Arduino, дело в софте. В ролике Джереми пользует версию 0.x. Вы, наверное, поставили последнюю — 1.0. Начиная с неё смысл Serial.flush() был изменён, чтобы соответствовать тому, что делает flush с потоками данных во всём остальном мире: дожидается пока накопленный буфер данных будет действительно отправлен адресату. Вы можете сэмулировать старый смысл так:

    Код (Text):
    while (Serial.available())
        Serial.read();
     
  3. freelancer89

    freelancer89 Нуб

    Спасибо, с этой проблемой успел уже сам разобраться =) Новая появилась. Управлять светодиодами через Web страницу. Под виндой все выходит отлично, работает как надо, а вот в линуксе что-то в ступор встал я.

    WEB:
    PHP:
    <form method="POST" action="1.php">

        <input type="submit" value="Вкл/Выкл светодиод 1" name="B1">
        <input type="submit" value="Вкл/Выкл светодиод 2" name="B2">
        <input type="submit" value="Вкл/Выкл светодиод 3" name="B3">
     
    </form>

    <?
    if (isset($_POST['B1']))
    {
    $i=1;

    }
    if (isset($_POST['B2']))
    {
    $cur2=1;

    $i=2;
    }
    if (isset($_POST['B3']))
    {
    $cur3=1;
    $i=3;
    }
    $fp =fopen("/dev/ttyACM1", "w+");

    //$i=$_POST['T1'];
    //echo $i;

        fwrite($fp, chr($i));
        echo fread($fp, 8192);
      //  sleep(3);

    fclose($fp);
     
    ?>
    В винде вместо /dev/ttyACM1 просто com3 указывается.

    Может сможете подсказать мне в чем проблема?
     
  4. freelancer89

    freelancer89 Нуб

    Немного разобрался, надо было апачу дать права на чтение и запись портов. Но столкнулся с другой проблемой. При нажатии кнопки в на веб странице RX светодиод загорается, но управляемый светодиод нет, а если запустить монитор серийного порта, то все работает как надо.
     
  5. nailxx

    nailxx Официальный Нерд Администратор

    Тут штука вот в чём. В Linux, как только последний процесс закрывает дескриптор, ссылающийся на последовательный порт, система дёргает линию DTR, что приводит к ресету Arduino. То есть на самом всякий раз, когда вы делаете


    fclose($fp);

    вы перезагружаете плату. Когда открыт Serial Monitor, именно он остаётся последним подключенным процессом и HUP не происходит. Решения три:

    1) Программное. Меняем отношение системы к порту, чтобы не делать HUP по закрытию:
    $ stty -F /dev/ttyACM0 -hup
    2) Программное. Открывайте порт при старте веб-приложения (fopen) и не закрывайте (fclose) никогда, либо до какого-то teardown'а вашего приложения. Извиняйте, я не спец в PHP
    3) Аппаратно. Воткните конденсатор на, скажем, 10 мкф между пинами 5V и RESET. Чип в этом случае вообще не заметит, что его хотят перезагрузить.
     
  6. freelancer89

    freelancer89 Нуб

    Спасибо за рекомендации. К сожалению, программные решение проблемы не помогли, но я теперь знаю в каком месте копать, спасибо. Аппаратное решение попробю завтра, как разживусь нужным конденсатором.
     
  7. fox7812

    fox7812 Нерд

    Есть php_serial class для этих целей, правда пока он у меня не хочет работать под линуксом. На винде - без проблем, но чтение данных с Arduino не реализовано.
     
  8. fox7812

    fox7812 Нерд

    Та же проблема. При попытке послать данные Arduino она перегружается. php выдает:
    Warning: Unable to open the device in /opt/lampp/htdocs/ard/php_serial.class.php on line 157
    Warning: Device must be opened in /opt/lampp/htdocs/ard/php_serial.class.php on line 541

    Программные решение не помогли, конденсатор остановил перезагрузку, теперь просто мигает tx и php выдает те же ошибки. В винде тоже проблем не было.