Arduino Nano + ENC28J60 + UIPEthernet + задержки 20-500мс
- Войдите на сайт для отправки комментариев
Всем привет,
столкнулся с проблемой задержек запрос-ответ порядка от 20 до 500мс.
Использую железку Arduino Nano + Ethernet Shield (ENC28J60) (вставлены друг в друга) и библиотеку UIPEthernet_library взятую отсюда
Ардуино использую в качестве сервера, клиент написан на Delphi.
Работает так: Клиент (программа Delphi) посылает строку (25 символов) Серверу(Arduino), Сервер получает и высылает ответ Клиенту и так в цикле с интервалом в секунду. Клиент фиксирует время выполнения запроса. Сервер тоже фиксирует время на цикл приема-отправки (см. скетч ниже).
Как видно из протокола опроса (например по трафику снятому WireShark-ом) есть периодическая задержка цикла запрос-ответ, не связанная с работой кода (скетча) Ардуины (и видимо библиотеки UIPEthernet), причем она периодически линейно уменьшается с ~300 мс до 10-20 мс.
С чем могут быть связаны такие задержки? Являются ли такие задержки нормальными для этого железа? Если нет, то как это побороть? Будет ли Arduino UNO + w5100 работать быстрее?
Или проблема все таки в библиотеке?...
P.S. Мне необходим быстрый сервер максимальная задержка на ответ от которого не должна превышать 20мс.
Вот скетч ардуины:
#include <UIPEthernet.h> byte mac[] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 }; IPAddress ip(192, 168, 137, 11); EthernetServer server(8888); unsigned long Time_Start = 0; unsigned long ReadTime = 0; unsigned long WriteTime = 0; unsigned long AvailableTime = 0; unsigned long CycleTime_Start = 0; unsigned long CycleTime = 0; void setup() { Ethernet.begin(mac, ip); server.begin(); } void loop() { EthernetClient client = server.available(); if (client) { while (client.connected()) { CycleTime_Start = millis(); Time_Start = millis(); if (client.available()) { AvailableTime = (millis() - Time_Start); uint8_t buf[25]; Time_Start = millis(); int bytesRead = client.read((uint8_t*)buf, 25); ReadTime = (millis() - Time_Start); if (bytesRead) { Time_Start = millis(); client.write(buf, 25); WriteTime = (millis() - Time_Start); CycleTime = (millis() - CycleTime_Start); client.print("AT = "); client.print(AvailableTime); client.print("ms | RT = "); client.print(ReadTime); client.print("ms | WT = "); client.print(WriteTime); client.print("ms | CT = "); client.print(CycleTime); client.println("ms"); } } } client.stop(); } }
Вот то что приходит Клиенту с Ардуины (dT - интервал времени запрос-ответ измеренный Клиентом):
Вот трафик снятый WireShark-ом: