Как определить СОМ порт
- Войдите на сайт для отправки комментариев
Ср, 06/08/2014 - 15:54
Всем привет!
Подцепил несколько диодов к mega2560, пытась управлять ими с помощью Processing.
Изначально указывал СОМ порт явно
println(Serial.list()); // I know that the first port in the serial list on my mac // is always my Keyspan adaptor, so I open Serial.list()[1]. // Open whatever port is the one you're using. myPort = new Serial(this, Serial.list()[1], 9600); myPort.clear(); s = myPort.readStringUntil(lf); s = null;
но хотелось бы чтобы программа сама находила к какому порту подключена ардуина.
пытался сделать это так(в proccesing):
void draw() { int nOfPort = -1; if (thisPort == false) { nOfPort++; myPort = new Serial(this, Serial.list()[nOfPort], 9600); myPort.clear(); s = myPort.readStringUntil(lf); s = null; myPort.write('9'); delay(500); } else {//код основной программы}
}
void serialEvent(Serial p) { s = myPort.readStringUntil(lf); // println (s); if (s != null) { colorZad(s); } } boolean thisPort = false;
void colorZad (String s) { char firstSymbol = s.charAt(0); char secondSymbol = s.charAt(1); switch(firstSymbol) { case 'y': thisPort = true; //для нужд основной программы case '-': atWork = false; a = '0'; break; case 'n': case 'N': koorZadv[5][2] = secondSymbol - '0'; break; case 'm': case 'M': koorZadv[6][2] = secondSymbol - '0'; break; case 'd': case 'D': koorZadv[7][2] = secondSymbol - '0'; break; case 'l': koorZadv[8][2] = secondSymbol; break; case'0': case'1': case'2': case'3': case'4': koorZadv[firstSymbol - '0'][2] = secondSymbol - '0'; break; ///////// } }
+ прошил в ардуино:
void loop() { while (Serial.available() == 0 ); if (val == 9) { Serial.println("yes"); } Main(val);//основная программа }
в итоге получаю ошибку при запуске скетча processing
Eror inside Serial.<init>()
Может кто сталкивался?как решить эту задачу?
(строго не судите пытался всё изложить досупно)
Заранее спасибо:)
да, 4 строку
04
int
nOfPort = -1;
вынес за пределы блока draw
и убрав открытие порта из блока setup() - сразу забыл это сделать - получаю ошибку
ArrayIndexOutOfBoundsException: 2- то есть вылетаю за пределы массива как я понял
структура автоматического поиска ардуины такая
1.ардуина ожидает данныс с кома
2. процессинг строит список имеющихся портов
3. поочерёдно пытается открыть все порты и отправить на них уникальную команду-строку типа "ping"
4. ардуина получив "ping" отсылает обратно ответ "pong" и свой ID
5. в процессинге цикл открытия порта и отсылки/чтения данных необходимо обернуть функцией исключения, потому как все занятые порты, недоступные и т.п. будут выдавать ошибку и остановку скетча
Таким методом можно идентифицировать хоть десяток одновременно подключенных дуин имеющих уникальные иды.
Поищите в "общем" "сканирующий тепловизор", там был пример работающий на эту тему. У меня оно есть, но на домашнем компе.
анализируя количество портов и возникшие ошибки процессинг должен уметь выдавать сообщения типа "нет доступных портов" или "обнаружено портов №№, ардуин не обнаружено". Идеально кконечно чтобы сканер ещё на доступных портах перебирал все варианты скорости порта. Но это долгая история. Проще принять какую то скорость за стандарт и ни в одном проекте в последующем без крайней надобности от него не отступать.
Все это замечательно, но пока нигде не нашел примера:
по определению доступных и недоступных COM-портов ? Кто подскажет...
Список доступных портов можно вывести так:
Посылать на эти порты "приветствие", на которое ардуино ответит.
Передает Arduino:
Принимает Processing:
sav liana
Вот только подключить ардуину после запуска программы не получится. И при отключении ардуины программа может зависнуть. По уму надо в draw() эти ситуации отрабатывать, для возможности горячей замены.
... и видимо с прерыванием.
Еще дело осложняется тем, что моя ардуина выдает внушительный поток... Зпутанное дело получается... И как работает Serial.Flush(); не понятно... Как то надо чистить буфер...
Пример со сканирующим тепловизором, видимо, этот... там вручную выбирается порт?
Я такой когда то делал тепловизор, тут даже скетч где то был.
Выдранная из контекста функция:
Если захотите в этом ужасном куске кода разобраться, то всё будет ясно. Весь смысл сводится к тому, что на команду #png в порт ардуина возвращает своё имя, в данном случае #pN001. Тот порт с которого пришел правильный ответ и есть наш. Процесс открытия порта обёрнут отлавнивателем исключений, потому как если попытаться открыть занятый порт, будет ошибка и остановка работы скетча. Если ни с одного из имеющихся портов ожидаемого отклика не пришло портов вообще не обнаружено, значит нужная ардуина не подключена.
Если выкинуть всё лишнее, то всё сводится к 10 строкам кода.
А началось всё с того, что на разных машинах у меня порты тогда оказались разные, лень было переназначать каждый раз.
До состояния "потеря ардуины" во время работы допиливается легко, но если только если структура команд строится по принципу "процессинг спросил, ардуина ответила".