0 голосов
Здравствуйте! Я Вам очень благодарен за помощь в предыдущем вопросе. Начал программировать так как сижу в карантине. Чтоб не сойти с ума, только начинаю открывать этот мир. Делаю некий скетч там есть функция клиента NTP после непродолжительной работы функция ожидания и формирования полученного пакета вываливается в ошибку. Чем это может быть вызвано? И как обойти?
Заранее благодарен.

\Arduino\libraries\WiFiNINA_Generic\src\utility\spi_drv.cpp::309]-W-Error waiting START_CMD
(23 баллов) 1 3 5
Покажите код, пожалуйста.

2 Ответы

+1 голос
 
Лучший ответ

Скорее всего при отладке ваш код выглядел так. Выполнялась  только первая строка при условии, а вторая строка выполнялась постоянно. 

if (myTimer1.isReady())
   Serial.println("Timer 1!");
       waitpacket();

Правильно было бы так

if (myTimer1.isReady())
{
   Serial.println("Timer 1!");
       waitpacket();
}

Функция myTimer1.isReady() возвращает логическую единицу?

(3.1 тыс. баллов) 15 20 41
выбран
Спасибо! Вы правы (хотя это была описка) надо было задать время запуска функции ожидания,  после отправки пакетов, не используя delay. Долго тормозил, прежде чем понял запускать по таймеру (раз в полсекунды), но ограничения накладывать по millis (запускать) через небольшую паузу (после отправки пакетов начинать обрабатывать пакет и гасить функцию через секунду после отправки пакетов.
0 голосов
oid loop()
{
   startprocedure();
   fadeselect();
   selectpumpvalue();
   buttons();
   
   if (myTimer1.isReady())
   // Serial.println("Timer 1!");
       waitpacket();
   
  if (myTimer2.isReady())
    //Serial.println("Timer 2!");
      lcdprint();
       
    
  if (myTimer3.isReady())
    //Serial.println("Timer 3!");
     ntptask();
     
     }

Выпадает вот этот блок:

void waitpacket()
   {
    //Serial.println("WAITPACKET  AFTER  PAUSE");
    if (Udp.parsePacket()) {
    Serial.println("packet received");
    // We've received a packet, read the data from it
    Udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer

    //the timestamp starts at byte 40 of the received packet and is four bytes,
    // or two words, long. First, esxtract the two words:

    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
    // combine the four bytes (two words) into a long integer
    // this is NTP time (seconds since Jan 1 1900):
    unsigned long secsSince1900 = highWord << 16 | lowWord;
    Serial.print("Seconds since Jan 1 1900 = ");
    Serial.println(secsSince1900);

    // now convert NTP time into everyday time:
    Serial.print("Unix time = ");
    // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
    const unsigned long seventyYears = 2208988800UL;
    // subtract seventy years:
    unsigned long epoch = secsSince1900 - seventyYears;
    // print Unix time:
    Serial.println(epoch);

    // print the hour, minute and second:
    Serial.print("The UTC time is ");       // UTC is the time at Greenwich Meridian (GMT)
    Serial.print((epoch  % 86400L) / 3600); // print the hour (86400 equals secs per day)
    Serial.print(':');
    if (((epoch % 3600) / 60) < 10) {
      // In the first 10 minutes of each hour, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.print((epoch  % 3600) / 60); // print the minute (3600 equals secs per minute)
    Serial.print(':');
    if ((epoch % 60) < 10) {
      // In the first 10 seconds of each minute, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.println(epoch % 60); // print the second   
      }
}
(23 баллов) 1 3 5
Добро пожаловать на Бредборд! Сайт вопросов и ответов на тему Arduino, Raspberry Pi и хоббийной электроники в целом. Цель Бредборда — быть максимально полезным. Поэтому мы строго следим за соблюдением правил, боремся с холиворами и оффтопиком.

    За этот месяц ещё никого.

    ...