Доброго времени суток. Только вчера получил посылкой ардунку. Начал сразу осваивать ее по видеороликам. Изучаю 6 серию. Столкнулся с проблемой, что когда по сериал соединению на ардуино посылаю "пачку мусора", то ардуино обрабатывает каждый символ, хотя я использую Serial.flush(). Думал что с кодом напортачил, скачал исходный код урока, загрузил скетч и тот-же самый результат.Подскажите, в чем может быть проблема? ОС: Ubuntu 10.04 (Lucid Lynx). Arduino: Arduino Uno R3.
Добрый! Дело не в Arduino, дело в софте. В ролике Джереми пользует версию 0.x. Вы, наверное, поставили последнюю — 1.0. Начиная с неё смысл Serial.flush() был изменён, чтобы соответствовать тому, что делает flush с потоками данных во всём остальном мире: дожидается пока накопленный буфер данных будет действительно отправлен адресату. Вы можете сэмулировать старый смысл так: Код (Text): while (Serial.available()) Serial.read();
Спасибо, с этой проблемой успел уже сам разобраться =) Новая появилась. Управлять светодиодами через 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 указывается. Может сможете подсказать мне в чем проблема?
Немного разобрался, надо было апачу дать права на чтение и запись портов. Но столкнулся с другой проблемой. При нажатии кнопки в на веб странице RX светодиод загорается, но управляемый светодиод нет, а если запустить монитор серийного порта, то все работает как надо.
Тут штука вот в чём. В Linux, как только последний процесс закрывает дескриптор, ссылающийся на последовательный порт, система дёргает линию DTR, что приводит к ресету Arduino. То есть на самом всякий раз, когда вы делаете fclose($fp); вы перезагружаете плату. Когда открыт Serial Monitor, именно он остаётся последним подключенным процессом и HUP не происходит. Решения три: 1) Программное. Меняем отношение системы к порту, чтобы не делать HUP по закрытию: $ stty -F /dev/ttyACM0 -hup 2) Программное. Открывайте порт при старте веб-приложения (fopen) и не закрывайте (fclose) никогда, либо до какого-то teardown'а вашего приложения. Извиняйте, я не спец в PHP 3) Аппаратно. Воткните конденсатор на, скажем, 10 мкф между пинами 5V и RESET. Чип в этом случае вообще не заметит, что его хотят перезагрузить.
Спасибо за рекомендации. К сожалению, программные решение проблемы не помогли, но я теперь знаю в каком месте копать, спасибо. Аппаратное решение попробю завтра, как разживусь нужным конденсатором.
Есть php_serial class для этих целей, правда пока он у меня не хочет работать под линуксом. На винде - без проблем, но чтение данных с Arduino не реализовано.
Та же проблема. При попытке послать данные 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 выдает те же ошибки. В винде тоже проблем не было.