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

Тема в разделе "Arduino & Shields", создана пользователем zakaso, 28 дек 2015.

  1. zakaso

    zakaso Нуб

    Всем привет,

    столкнулся с проблемой задержек запрос-ответ порядка от 20 до 500мс.

    Использую железку Arduino Nano + Ethernet Shield (ENC28J60) (вставлены друг в друга) и библиотеку UIPEthernet_library взятую отсюда (https://github.com/ntruchsess/arduino_uip)

    Ардуино использую в качестве сервера, клиент написан на Delphi.

    Работает так: Клиент (программа Delphi) посылает строку (25 символов) Серверу(Arduino), Сервер получает и высылает ответ Клиенту и так в цикле с интервалом в секунду. Клиент фиксирует время выполнения запроса. Сервер тоже фиксирует время на цикл приема-отправки (см. скетч ниже).

    Как видно из протокола опроса (например по трафику снятому WireShark-ом) есть периодическая задержка цикла запрос-ответ, не связанная с работой кода (скетча) Ардуины (и видимо библиотеки UIPEthernet), причем она периодически линейно уменьшается с ~300 мс до 10-20 мс.

    С чем могут быть связаны такие задержки? Являются ли такие задержки нормальными для этого железа? Если нет, то как это побороть? Будет ли Arduino UNO + w5100 работать быстрее?

    Или проблема все таки в библиотеке?...

    P.S. Мне необходим быстрый сервер максимальная задержка на ответ от которого не должна превышать 20мс.

    Вот скетч ардуины:
    Код (C++):
    #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-ом:
    [​IMG]