Почему командная строка BOSSA не распознает Arduino Due?
Запуская Ubuntu 12.04.4 LTS (64-разрядная версия), я пытаюсь загрузить свой код в Arduino Due через собственный порт. Я пробовал как bossac
, поставляемый с Arduino IDE (который является модифицированной версией BOSSA), так и главную ветку BOSSA.
Выполнение этой команды:
sudo ./bossac -p /dev/ttyACM0
Я получаю эту ошибку:
No device found on /dev/ttyACM0
Тем не менее, он отлично работает внутри Arduino IDE.
В чем может быть проблема?
@Friend of Kim, 👍4
3 ответа
Лучший ответ:
из меню IDE вы можете активировать режим подробной загрузки (и компиляции), в котором будут напечатаны все выполненные команды; Вероятно, вы упускаете необходимость открыть последовательный порт на скорости 1200 бод, что приведет к перезагрузке и последующему запуску загрузчика на чипе DUE, а боссаку нужно найти загрузчик. см. автоматический сброс
изменить: теперь у меня есть компьютер с физическим серийным номером, поэтому я попытался загрузить его в подробном режиме:
Sketch uses 10,380 bytes (1%) of program storage space. Maximum is 524,288 bytes.
Forcing reset using 1200bps open/close on port /dev/ttyS0
/home/xxx/arduino-1.5.6-r2/hardware/tools/bossac -i -d --port=ttyS0 -U false -e -w -v -b /tmp/build8035422101690460839.tmp/sketch_apr14a.cpp.bin -R
как вы можете видеть, он сбрасывает плату, открывая COM порт на 1200, заставляя стартовать загрузчик. Вы должны сделать то же самое в своем скрипте перед запуском боссака. Как это можно сделать, зависит от вашей ОС
Обратите внимание, что сброс запускается чипом 8u2, используемым в качестве USB-адаптера последовательного порта на плате Arduino, поэтому его можно обойти, подключившись через контакт tx/rx (например, используя собственный преобразователь, как в моем примере с аппаратным последовательным портом). не будет работать, если вы не сделаете ручной сброс в нужное время
Самый простой способ сделать это исключительно из терминала:
stty -f /dev/cu.usbmodemfa121 1200;stty stop /dev/cu.usbmodemfa121;./bossac -i -d --port=tty.usbmodemfa121 -U false -e -w -v -b Blink.cpp.bin -R
Замените последовательное устройство любым устройством /dev, которое вы используете; в Linux вам может понадобиться sudo, чтобы получить прямой доступ к устройству. Предполагается, что вы находитесь в каталоге, где живет боссак, и ваш файл .bin тоже находится там. Отрегулируйте в соответствии с вашими потребностями. Если вы используете собственный порт USB, вы должны изменить -U на true
В интерфейсе командной строки Arduino используется версия bossa, немного отличающаяся от той, что находится на мастере:
https://github.com/shumatech/BOSSA/tree/arduino
В Linux я смог сделать следующее:
$ git clone [email protected]:shumatech/BOSSA.git
$ cd BOSSA
$ make bin/bossac -j4
$ stty -F /dev/ttyACM0 1200
$ ./bin/bossac --port=/dev/ttyACM0 --force_usb_port=true -e -w -v -b /path/to/my/firmware.bin -R
(Я получил ответ из этой ветки форума Arduino.)
- Flash Arduino Due через UART
- Можно ли запрограммировать Arduino Due с подключенными обоими USB-портами?
- Первая настройка - отказ в доступе к usb-порту - ubuntu 14.04
- Arduino Due vs Mega 2560
- Точность часов времени Arduino
- Регистры ввода-вывода SAM3X8E (Arduino Due)
- Отсутствует /dev/ttyACM* в Ubuntu
- Построение графика на Python с использованием Tkinter Canvas
Я не вижу, что он делает, потому что выводится слишком много строк. Первые строки, где он звонит BOSSA, обрезаются., @Friend of Kim
Я нашел путь. Нажмите кнопку загрузки в процессе загрузки. Он потерпит неудачу и больше не будет выводить слишком много строк. Я собираюсь попробовать это сейчас., @Friend of Kim
вы также можете попробовать с незавершенным (или физическим последовательным портом, к которому ничего не подключено), @Lesto
Я считаю, что проблема заключалась либо в аргументах командной строки, либо в том, что перед подключением к плате необходимо было перезагрузить плату. Я не могу подключиться к нему через master bossash.exe, поэтому, похоже, они что-то изменили в Due, сделав мастер BOSSA бесполезным. Я еще не совсем знаю, но я постараюсь оставить комментарий позже, когда я во всем этом разобрался., @Friend of Kim
отредактировал мой ответ, как и ожидалось, сброс, открывающий серийный порт со скоростью 1200 бод, является фундаментальным проходом. Также обратите внимание, что загрузка, вероятно, как небольшой тайм-аут, поэтому вам нужно написать сценарий выполнения сброса + загрузки, чтобы сделать это во временном интервале., @Lesto
Сбрасывается ли он при подключении к 1200 из-за кода, написанного Arduino? Если бы я запрограммировал Due без библиотеки Arduino, этот метод перестал бы работать? Сохраняется ли загрузчик Arduino, который запускается автоматически, в памяти, отличной от кода, который мы обычно прошиваем в чип?, @Friend of Kim
никакого специального кода не требуется, достаточно открыть последовательный порт на скорости 1200 бод, и да, загрузчик находится в специальной области, как в UNO! Пока вы не получите этот сброс, вы можете программировать, используя все, что хотите., @Lesto
Хм, а как он узнает, что серийный номер открыт на скорости 1200 бод? Разве это не тот номер, который обе части должны знать заранее?, @Friend of Kim
возможно автоматическое определение скорости передачи данных. Кстати, вы забываете, что это виртуальный последовательный порт через USB, может применяться какой-то трюк. см. /hardware/arduino/sam/cores/arduino/USB/CDC.cpp, @Lesto
Хорошо, я могу загрузить его сейчас. Проблема только в том, что после загрузки Arduino не перезагружается, и подключиться к ней без перезагрузки компьютера невозможно., @Friend of Kim
перезагрузить комп?? просто отключить/переподключить USB не работает? вы закрываете последовательное соединение?, @Lesto
Виноват. Перезагрузка компьютера сработала только один раз. Теперь даже Arduino IDE не распознает его, используя родной порт. Он находит Due в порту программирования, но не может загрузить с него код. Да, я закрыл соединение., @Friend of Kim
это другой вопрос, я думаю. USB для разработчиков работает, а для пользователей нет? Как вы компилируете код? ПК обнаруживает usb?, @Lesto
ПК не обнаруживает USB при прямом подключении к SAM (собственный), но распознает при подключении к порту программирования. Все с использованием Arduino IDE, он не может загружать код через USB для программирования. Может ли быть что-то не так с Arduino Due? При подключении RESET к GND ничего не происходит., @Friend of Kim
давайте [продолжим это обсуждение в чате](http://chat.stackexchange.com/rooms/13936/discussion-between-lesto-and-friend-of-kim), @Lesto
Извините, но этот ответ в корне ошибочен. Открытие порта на скорости 1200 бод специально **не может ничего сделать** для истинного последовательного порта, как указано здесь. Это только «волшебство» с последовательным USB-устройством, где скорость передачи данных является параметром, передаваемым аппаратному обеспечению. Но во многих конфигурациях простое открытие последовательного порта (настоящего или USB) *изменит* состояние линий управления, которые могут быть подключены для запуска сброса., @Chris Stratton
@ChrisStratton мой ответ остается в силе, поскольку он открывает драйвер acm ttyACM0 с ведьмой IS (виртуальный последовательный порт через USB), и драйвер usb на должном уровне был специально написан для использования его в качестве запроса на перезагрузку. Странно, но факт: см. «программирование » на http://arduino.cc/en/Main/arduinoBoardDue., @Lesto
Я в курсе про спецкожух - но тут он не применяется. Ваш ответ ошибочен, поскольку ** в вашем ответе ** вы, как по описанию, так и по цитируемой команде, получаете доступ к настоящему последовательному порту /dev/ttyS0, а не к USB. То, что вы предлагаете, не будет работать для настоящего последовательного порта., @Chris Stratton
Я понимаю. Это потому, что этот вывод исходит от arduino ide, и поскольку у меня не было Due, я сказал ide использовать порт hw. Теперь я понимаю, что вы говорите, и я укажу на это, @Lesto
Ваше описание и пример команды по-прежнему ссылаются на аппаратный последовательный порт, где этот трюк не сработает., @Chris Stratton
Исправлено, я думаю. Не стесняйтесь редактировать, если вам это не нравится, @Lesto