Последовательная печать замедляет выполнение кода. Ардуино из-за

Мы используем Arduino Due для отправки последовательных данных через USB в программу, созданную в Visual Studio.

Проблема, с которой мы сталкиваемся, связана с Due. У нас есть участок кода, который критичен по времени

      PumpCycleTime = millis();
      // Loop this until the pumpHIGH duration has expired
      do
      {
        digitalWrite(Pump, HIGH);
        SendSerialData();
      }
      while (millis() - PumpCycleTime < PumpHIGH);


      // Record the pump cycle LOW start time
      PumpCycleTime = millis();
      // Loop this until the pumpLOW duration has expired
      do
      {
        digitalWrite(Pump, LOW);
        SendSerialData();
      }
      while (millis() - PumpCycleTime < 1);

Изначально мы регулировали частоту пампа с помощью задержек. Что дало нам достоверные частоты при измерении на осциллографе. Однако это, конечно, скомпрометировало построение графиков, так как в данных были пробелы.

С помощью millis() мы не можем получить ту же частоту. Очевидно, что мы могли бы компенсировать достижение одной частоты, однако нам нужно иметь возможность надежно использовать диапазон частот.

Кажется, что SendSerialData(), функция с примерно 15 serial.print, влияет на тайминги, так как без нее частота соответствует ожидаемой.

Кто-нибудь знает какие-нибудь решения? Регистрация данных и построение графика в режиме реального времени необходимы и не могут быть скомпрометированы.

заранее спасибо


person charley    schedule 10.01.2017    source источник
comment
Проблема в том, что функция последовательной записи (используемая печатью) немедленно возвращается, если ей удается поместить байт в последовательный буфер, в противном случае блокируется до тех пор, пока в буфере не останется хотя бы одно место. Очевидно, вы пишете слишком много данных в сериале. Обходные пути: 1) увеличить последовательную скорость (выше скорость -> меньше время отправки); 2) разделить функции печати на разные функции, вызываемые в разное время; 3) создайте большой массив и заполните его; затем периодически пытайтесь сбросить с него какие-то байты через последовательный интерфейс...   -  person frarugi87    schedule 10.01.2017
comment
... Проверьте функцию AvailableForWrite(), которая поможет вам -блокировка последовательной записи. Или, если вам нужно всегда отправлять одни и те же данные, спроектируйте конечный автомат для лучшего управления отправкой.   -  person frarugi87    schedule 10.01.2017
comment
@frarugi87 Управление объемом отправляемых данных, безусловно, помогло!   -  person charley    schedule 11.01.2017


Ответы (1)


Если время настолько критично, НЕ используйте delay(), используйте Конечный автомат. Более того, какая у вас скорость передачи данных? если это 9600, есть большая вероятность, что ваше замедление из-за println();, попробуйте использовать большую скорость (например, 115200).

Надеюсь, это поможет.

Йоав

person YoavShtainer    schedule 10.01.2017