Для первого проекта использую Ethernet LAN Network Module ENC28J60. Проблема в том, что страницы открываются с 10-го раза, ардуино подвиссает, приходится постоянно ресать его. Есть предположение, что когда я нагружаю интернет, то это вот таким образом отражается на этом модуле. Когда я освобождаю канал, то вроде нормально начинает работать. Есть еще мое мнение, что это просто Ethernet LAN Network Module ENC28J60, как говорится, "сделан из риса" и поэтому так работает. Еще мне кажется, но не уверен, если купить Ethernet Shield для Arduino W5100, то эта проблема исчезнет. Кто сталкивался с подобным подскажите?
Да вроде особого криминала не вижу, если честно. Вы упомянули, что Arduino подвисает - как это проявляется? Сервы перестают работать, ещё как? Надо смотреть конфликты - Servo юзает таймеры, у вас тоже таймер задействован. Проверяйте конфликты таймеров, используемых пинов и т.п.
проявляется так, что когда я, например, обращаюсь по адресу http://192.168.0.110:81/, то получаю так бывает не всегда, но в основном именно так. Допустим, страница загрузилась и я вижу кнопки, определены в скетче. Нажатием на кнопку, перехожу по адресу http://192.168.0.110:81/start и зажигаю диод. Если я буду обновлять эту страницу 10 раз с периодичностью 1сек, то вероятнее всего, произойдет зависание и диод будет гореть всегда, хотя он должен тухнуть через 5сек. Далее команды ардуино не воспринимает.
@kef82871, попробуйте библиотеку EtherCard https://github.com/jcw/ethercard, EtherShield https://github.com/thiseldo/EtherShield лет пять не развивается и не поддерживается.
Строчка кода: Код (C++): if (params = eth.serviceRequest()) может тянуть на криминал -- надо внимательно посмотреть на код функции 'serviceRequest()', каким образом она подготавливает результат. И после компиляции прошивки обычно выводится информация об объёме памяти выделяемой для различных секций -- хотелось бы взглянуть на эту информацию.
На мой взгляд - тут полный криминал, ибо не Код (C++): if (params = eth.serviceRequest()) а Код (C++): if (params == eth.serviceRequest())
Тут никакого криминала нет, всё штатно с точки зрения синтаксиса: сперва в params заносится результат вызова eth.serviceRequest(), потом уже params сравнивается на ненулевое значение. Т.е. это короткая запись следующей: Код (C++): params = eth.serviceRequest(); if(params) {}
Как уже было сказано, криминал не в условии, а в самой функции 'serviceRequest()'. Судя по коду эта функция возвращает указатель на участок памяти (char *), так вот надо разобраться что это за участок и каким образом он выделяется?
я провел эксперимент и использовал другую библиотеку для теста - EtherCard https://github.com/jcw/ethercard. залил стандартный пример с со счетчиком секунд. Код (C++): // This is a demo of the RBBB running as webserver with the Ether Card // 2010-05-28 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php #include <EtherCard.h> // ethernet interface mac address, must be unique on the LAN static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; static byte myip[] = { 192,168,0,110 }; byte Ethernet::buffer[500]; BufferFiller bfill; void setup () { if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) Serial.println(F("Failed to access Ethernet controller")); ether.staticSetup(myip); } static word homePage() { long t = millis() / 1000; word h = t / 3600; byte m = (t / 60) % 60; byte s = t % 60; bfill = ether.tcpOffset(); bfill.emit_p(PSTR( "HTTP/1.0 200 OK\r\n" "Content-Type: text/html\r\n" "Pragma: no-cache\r\n" "\r\n" "<meta http-equiv='refresh' content='1'/>" "<title>RBBB server</title>" "<h1>$D$D:$D$D:$D$D</h1>"), h/10, h%10, m/10, m%10, s/10, s%10); return bfill.position(); } void loop () { word len = ether.packetReceive(); word pos = ether.packetLoop(len); if (pos) // check if valid tcp data is received ether.httpServerReply(homePage()); // send web page data } как и раньше, каждую секунду страница обновляется и отображаются прошедшие секунды, но опять происходит зависание и браузер пишет, что ""не удается получить доступ к сайту". помогает только ресет ардуины. пробовал немного подождать, но ничего. может есть способ определить причина в сетевухе или ардуине?
Может есть у кого-то возможность закинуть этот скетч к себе и попробовать хотя бы на 10 минут запустить и посмотреть, будет ли зависание у вас?
переставил питание с 3.3 на 5 и полные зависания прекратились, теперь появляются зависания длительностью около 30 сек иногда. веду вывод из основного цикла в serial и там продолжается работа во время того, как сетевая не отвечает. короче, эти сетевые реально плохие о чем люди и пишут: http://arduino.ru/forum/apparatnye-voprosy/problema-s-enc28j60arduino-0 https://geektimes.ru/post/255430/ http://publikz.com/blog_19178 придется покупать W5100, т.к. 5500 ооочень дорогая.
Сетевая и не должна отвечать,отвечать должен(а) ардуина,enc всего лишь конвертер,собсвенного стека не имеет,вся обработка происходит в ардуино, 5 вольтами можете поджарить enc(выходной каскад передатчика)
вроде решилась проблема, переводом на 5v и установкой порта на 2288), ранее был 81. с тех пор проблем не замечал. у меня и проскакивала мысль, что 81 порт каким-то образом забивается что ли.