Arduino + enc28j60+ библиотека Ethercard
- Войдите на сайт для отправки комментариев
Уже несколько дней бьюсь, чтобы понять почему так происходит:
Есть Arduino pro mini и дешевый ethernet на чипе enc28j60. Подключаю библиотеку ethercard - свежую версию с https://github.com/jcw/ethercard
Часть примеров работает, часть нет.
Притом выяснил зависимость - например пример ниже - не работает вообще - виснет при инициализации:
// This demo does web requests via DNS lookup, using a fixed gateway. // 2010-11-27 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php #include <EtherCard.h> #define REQUEST_RATE 5000 // milliseconds // ethernet interface mac address static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; // ethernet interface ip address static byte myip[] = { 192,168,1,203 }; // gateway ip address static byte gwip[] = { 192,168,1,1 }; // remote website name const char website[] PROGMEM = "google.com"; byte Ethernet::buffer[300]; // a very small tcp/ip buffer is enough here static long timer; // called when the client request is complete static void my_result_cb (byte status, word off, word len) { Serial.print("<<< reply "); Serial.print(millis() - timer); Serial.println(" ms"); Serial.println((const char*) Ethernet::buffer + off); } void setup () { Serial.begin(57600); Serial.println("\n[getViaDNS]"); if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) Serial.println( "Failed to access Ethernet controller"); ether.staticSetup(myip, gwip); if (!ether.dnsLookup(website)) Serial.println("DNS failed"); ether.printIp("Server: ", ether.hisip); timer = - REQUEST_RATE; // start timing out right away } void loop () { ether.packetLoop(ether.packetReceive()); if (millis() > timer + REQUEST_RATE) { timer = millis(); Serial.println("\n>>> REQ"); ether.browseUrl(PSTR("/foo/"), "bar", website, my_result_cb); } }
Совершенно случайно заметил, что если в строке
const char website[] PROGMEM = "google.com";
убрать PROGMEM, то инициализация проходит, но ether.browseUrl отрабатывает некорректно - параметр website в GET запрос не передается - проверил при помощи WireShark - перехватил пакет и увидел, что во второй строке - пусто.
Что уже попробовал в качестве траблшутинга
- менял версию Arduino IDE - экспериментировал на 1.05, 1.01 и 1.03
- менял enc28j60 - у меня их несколько штук
- пробовал заменить Arduino pro mini сначала на другой экземпляр, потом для очистки совести, на Arduino Uno
- с питанием все ок - через это я уже прошел раньше - поставил дополнительный стабилизатор на 3,3 В (AMS1117)
- естественно про известный казус с подключением CS на 8-й вывод вместо 10-го знаю.
Ничего не помогает - если имя сайта пишу во флеш при помощи PROGMEM - виснет при инициализации, если без PROGMEM, то не работает ether.browseUrl.
Вопрос уже просто принципиальный - почему есть куча примеров реализаций в интернете на этом же железе и этой же библиотеке и у всех все работает, а у меня не работает!!!???
Помогите советом, плиз!!!
Сам разобрался. Последняя версия библиотеки на https://github.com/jcw/ethercard - не полностью рабочая.
Взял из архивов прошлогоднюю - все работает.
Поделись плиз где взял рабочую версию, походу я на теже грабли наступил.
Сам разобрался. Последняя версия библиотеки на https://github.com/jcw/ethercard - не полностью рабочая.
Взял из архивов прошлогоднюю - все работает.
Спасибо добрый человек, тоже имел проблемы на вроном месте.
На гитхабе и взял - там же (если кликнуть на commits: https://github.com/jcw/ethercard/commits/master ) лежат все предыдущие версии с историей изменений. Откатывался на все более раннние, пока не заработало :-)
Рад, если кому-то помог. Кстати как их последние версии - не пофиксили? смотрю есть свежие изменения....
Нашел эту тему, надо было передавать имена сервера урл - программно. То есть не через прогмем, а зается оно в меню. Точнее в еепром.
Немного поковырял библиотеку,
тут подробней - может кому пригодится
http://publikz.com/blog_18519
У меня несколько вопросов, начала работать с EtherCard
const char http_OK[] PROGMEM = "HTTP/1.0 200 OK\r\n" "Content-Type: text/html\r\n" "Pragma: no-cache\r\n\r\n"; void homePage() { buf.emit_p(PSTR("$F" "<!DOCTYPE html>" "<html><head><meta charset=\"utf-8\" />" "<title>HTML5</title>" "</head>" "<body>" "<p>Привет, мир</p>" "</body>" "</html>"), http_OK); }Что такое PSTR?
$F это переменная в которую "печатается" http_OK?
PSTR() - это макрос, который оставляет строки в Progmem Space по месту объявления (типа). См. #16 , например.
Но, бросали бы Вы это EtherCard - не шибко он гибкий. UIPEthernet (из старых выпусков) возьмите и всё. Примеры подходят от обычной Ethernet.h (почти все).
пытаюсь попользовать
Send UDP packet
To send a UDP packet use
ether.sendUdp().что должно быть в IP_LEN ? количество символов IP адреса?
PSTR() - это макрос, который оставляет строки в Progmem Space по месту объявления (типа). См. #16 , например.
Но, бросали бы Вы это EtherCard - не шибко он гибкий. UIPEthernet (из старых выпусков) возьмите и всё. Примеры подходят от обычной Ethernet.h (почти все).
да, много заморочек.
Вообще, посоветуйте библиотеку для обмена UDP пакетами.
Для ENC я знаю только две: EtherCard и UIPEthernet.
в UIPEthernet не нашёл примеров с DHCP
Что ж поделать, если не нашли. Другие как-то справляются, находят.
Форум то, на самом деле, бестолковый. Еще ни разу не помогли.
Зря потерянное время...
На других люди более грамотные и отзывчивые.
Форум то, на самом деле, бестолковый. Еще ни разу не помогли.
Зря потерянное время...
На других люди более грамотные и отзывчивые.
вот ведь гады, никто готового кода не дал...
Форум то, на самом деле, бестолковый. Еще ни разу не помогли.
Зря потерянное время...
На других люди более грамотные и отзывчивые.
Просто этот форум для жаждущих знаний. А для «слепить по быстрому» есть куча других форумов. И я сначала не доумевал, но согласен. Представь что ты решил сделать управление газовым котлом не понимая что вообще делаешь (и фразы - ну у других же работает ничего не меняют). И вот в один момент котёл погас, электроника не сработала, потому что ты код хреновый сделал и все кто в доме жил - скажем так, перестали там жить и не по своей воле. А ты был в командировке. Как ты сам потом жить сможешь и что скажешь остальным родственникам?!
нет уж, если делать то со знанием. А если хочешь быстро и профессионально - то в платный отдел. И я, честно говоря, сомневаюсь, что даже там что-то типа газового котла даже за деньги делать будут. Ты же можешь не так подключить, упустить нюансы и тому подобное.
Суть моего ликбеза - хочешь сделать хорошо - сделай сам, но чтобы было не хорошо - а на отлично!
Форум то, на самом деле, бестолковый. Еще ни разу не помогли.
Зря потерянное время...
На других люди более грамотные и отзывчивые.
Просто этот форум для жаждущих знаний. А для «слепить по быстрому» есть куча других форумов. И я сначала не доумевал, но согласен. Представь что ты решил сделать управление газовым котлом не понимая что вообще делаешь (и фразы - ну у других же работает ничего не меняют). И вот в один момент котёл погас, электроника не сработала, потому что ты код хреновый сделал и все кто в доме жил - скажем так, перестали там жить и не по своей воле. А ты был в командировке. Как ты сам потом жить сможешь и что скажешь остальным родственникам?!
нет уж, если делать то со знанием. А если хочешь быстро и профессионально - то в платный отдел. И я, честно говоря, сомневаюсь, что даже там что-то типа газового котла даже за деньги делать будут. Ты же можешь не так подключить, упустить нюансы и тому подобное.
Суть моего ликбеза - хочешь сделать хорошо - сделай сам, но чтобы было не хорошо - а на отлично!
BOOM ты что накатил?