Arduino Nano + ENC28J60 + UIPEthernet + задержки 20-500мс

Нет ответов
zakaso
Offline
Зарегистрирован: 28.12.2015

Всем привет,

столкнулся с проблемой задержек запрос-ответ порядка от 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 - интервал времени запрос-ответ измеренный Клиентом):

31.23.40.26.46.62.12.4E    dT = 68мс
AT = 0ms | RT = 0ms | WT = 0ms | CT = 0ms    dT = 68мс
52.39.15.30.09.39.23.46    dT = 53мс
AT = 2ms | RT = 0ms | WT = 0ms | CT = 2ms    dT = 53мс
3A.45.33.50.20.41.46.46    dT = 40мс
AT = 2ms | RT = 0ms | WT = 0ms | CT = 2ms    dT = 40мс
15.4F.05.49.29.35.5F.21    dT = 25мс
AT = 2ms | RT = 0ms | WT = 0ms | CT = 2ms    dT = 25мс
30.5A.4B.3A.20.3E.5E.3B    dT = 12мс
AT = 2ms | RT = 0ms | WT = 0ms | CT = 2ms    dT = 13мс
3C.2F.09.11.30.5A.59.1C    dT = 248мс
AT = 2ms | RT = 0ms | WT = 1ms | CT = 3ms    dT = 248мс
3A.1D.61.21.39.5D.32.17    dT = 235мс
AT = 2ms | RT = 0ms | WT = 0ms | CT = 2ms    dT = 235мс
5E.0A.32.3B.40.2C.4D.52    dT = 221мс
AT = 1ms | RT = 1ms | WT = 0ms | CT = 2ms    dT = 221мс
4C.41.2C.50.33.29.4B.25    dT = 206мс
AT = 1ms | RT = 1ms | WT = 0ms | CT = 2ms    dT = 206мс
62.2B.40.5B.3A.54.05.45    dT = 193мс
AT = 1ms | RT = 0ms | WT = 1ms | CT = 2ms    dT = 193мс
0A.50.12.4D.50.03.09.43    dT = 180мс
AT = 1ms | RT = 1ms | WT = 0ms | CT = 2ms    dT = 180мс
04.5A.1E.03.0A.1C.1E.60    dT = 165мс
AT = 1ms | RT = 0ms | WT = 1ms | CT = 2ms    dT = 165мс
35.5C.18.02.03.2C.05.41    dT = 151мс
AT = 1ms | RT = 0ms | WT = 1ms | CT = 2ms    dT = 151мс
3D.08.52.51.4C.49.23.07    dT = 137мс
AT = 2ms | RT = 0ms | WT = 0ms | CT = 2ms    dT = 137мс
3B.05.55.18.28.22.33.3C    dT = 124мс
AT = 2ms | RT = 0ms | WT = 0ms | CT = 2ms    dT = 124мс
11.05.24.03.3B.2F.2E.40    dT = 109мс
AT = 2ms | RT = 0ms | WT = 0ms | CT = 2ms    dT = 109мс
05.2C.3D.61.2C.60.5E.34    dT = 96мс
AT = 2ms | RT = 0ms | WT = 0ms | CT = 2ms    dT = 97мс
48.5A.02.19.4B.35.36.37    dT = 83мс
AT = 1ms | RT = 0ms | WT = 1ms | CT = 2ms    dT = 83мс

Вот трафик снятый WireShark-ом: