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-ом:
