Общение с Arduino Due Core через Native USB

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

В связи с покупкой Arduino Due Core, у которого есть только native USB порт, возникла идея работать через него.

У меня этот порт стандартно появляется как COM18.

Надо сказать, с этим портом при прошивке постоянно возникают какие-то "особенности": при каждой попытке прошивки он отваливается. После чего требуется перезагрузка, после которой появляется либо он, либо COM19. После перепрошивки порт снова отваливается. 

Открытие монитора порта подвешивает контроллер. Выход - перезагрузка.

Ну да ладно...

Проблема в том, что не могу налдадить обмен информацией через нативный порт (SerialUSB)

void setup() {
    pinMode(13, OUTPUT);
    digitalWrite(13, HIGH);
    delay(50);             
    digitalWrite(13, LOW); 
    delay(50);             
    digitalWrite(13, HIGH);
    delay(50);             
    digitalWrite(13, LOW); 
    delay(50);             
    digitalWrite(13, HIGH);
    delay(50);             
    digitalWrite(13, LOW); 
    delay(50);             

  SerialUSB.begin(9600);
//  while(!SerialUSB);
  delay(1000);
  Serial.begin(9600);
  while(!Serial);
//  Serial.println("begin PROG");
}

void loop() {
  if(SerialUSB.available()) {
    byte b = SerialUSB.read();
    digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(500);              // wait for a second
    digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
    delay(100);              // wait for a second
    SerialUSB.write(b);
  } else {
    digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(100);              // wait for a second
    digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
    delay(500);              // wait for a second
  }
//  SerialUSB.println("Native");
//  Serial.println("Prog");
}

Если раскомментировать строку 16, то скетч на ней и останавливается.

Если раскомментировать строку 36, скетч никак не реагирует на ввод.

Если обратно закоментировать строку 36, а также строку 28, скетч читает символы из порта. Количество прочитанных символов равно n+1. 

Если раскомментрровать строку 28, скетч осуществляет ввод один раз, а на втором - зависает.

Поиск в И-нете к решению не привел: как правило, людей интересует высокоскоростной ввод в native USB, жалобы на неработающий вывод попадаются гораздо реже, но решения ни в одном случае не видел.

 

На обычной Arduino Due работает так же. (при подключении через native USB)

 

Какие есть идеи - как добиться двустороннего обмена через native USB?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Что-то при размещении сообщения поплыли номера строк. Следует читать:

Если раскомментировать строку 17, то скетч на ней и останавливается.

Если раскомментировать строку 38, скетч никак не реагирует на ввод.

Если обратно закоментировать строку 38, а также строку 31, скетч читает символы из порта. Количество прочитанных символов равно n+1. 

Если раскомментрровать строку 31, скетч осуществляет ввод один раз, а на втором - зависает.

 

Да, ни в каком случае в монитор порта ничего не попадает.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

andriano, у меня стандартая дуе, вывод в сериал через натив работает отлично. Причём инитится он по дефолту, попробуйте без всего лишнего вот так:

void setup() {}

void loop() {
SerialUSB.println(millis()/1000);

  }

Это 100% работает через натив на обычной Due

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

dimax, спасибо.

Обычная Due и Core ведут себя через native USB одинаково (по крайней мере, разницы я не заметил).

Некоторая логика здесь есть - задание скорости, которая для COM как раз и задается в begin(), для USB неактуально. 

Теперь, правда, другая неприятность: после прошивки порт отваливается, после перезагрузки - тоже (думаю, что это одно и то же). Соответственно, "поймать" в монитор примерно первые 10 секунд после перезагрузки не получается.

И время от времени приходится прибегать к методике знакомой многим ардуинщикам, но которая меня раньше как-то обходила стороной, - вовремя нажимать на reset при прошивке.

Ладно, будем приспосабливаться.

Еще раз спасибо.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

andriano, 10 секунд что-то много. У меня тоже тренькает, но довольно быстро. Счёт в том примере я видел с 1-й же секунды, при открытом мониторе порта разумеется.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Т.е. нажать на reset, перенести руку на мышь, закрыть окно монитора порта, открыть двухуровневое меню, из которого выбрать номер COM-порта  и запустить монитор порта заново у Вас получается менее чем за секунду?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

andriano, Дабы не ввеcти вас в заблуждение -проверил. И так, подключаю кабелем в Native port. Выбираю в IDE плату, выбираю порт. Пишу скетч, для точности измерения без /1000. Чтоб знать прямо  в миллисекундах. Сразу открываю "монитор порта" -пока там пусто, т.к. загружен дефолтный блинк.Нажимаю кнопка "загрузка", скетч компилится и загружается, и ничего не больше не трогая вижу на экране это:

там с портами действительно заморочки были- потому что загрузчик делает один порт, а usbserial -другой. Правильный порт всегда подписан как у меня на скриншоте в заголовке монитора порта, и если тыркать на ресет оно может заглючить -старый "правильный" порт подвиснет, и система сгенерит ещё один. Так что лучше лишний раз не пользоваться ресетом. А если уже глюкануло, то лучше в диспетчере устройств включить отображение скрытых устройств, и удалить все ком-порты.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Нет у меня привычки "тыркать на ресет". Вообще ни разу не "тыркал" ни с одним контроллером, включая Due - программный порт. Reset нажимаю только в двух случаях:

- контроллер завис (я все отлаживал по "блинку": нет мигания, значит, завис),

- в списке портов нет ничего кроме COM1.

Но еще поэкспериментирую - попытаюсь точнее определить, в каких случаях отваливется порт. До этого, вероятно, он отваливался из-за SerialUSB.begin(). Теперь буду перебирать варианты без него.

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016

Когда первый раз подключаешь due в usb через native port, в диспетчере устройств она определяется как Bossa чего-то там  с каким-то номером порта. При перетыкании usb шнурка она уже определяется нормально, как arduino due с другим номером порта. Надо подпаивать резистор на плату (надо поискать куда), чтобы определялась нормально с первого раза. 
Возможно в этом дело.
 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

diakin, речь идет о немного другой плате: