2017-01-10 15 views
0

Мы используем Arduino Для отправки последовательных данных через usb на часть программного обеспечения, созданного в визуальной студии.Последовательная печать, замедляющая выполнение кода. Arduino Due

Проблема, с которой мы сталкиваемся с 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, производит тайминги, так как без нее частота будет такой, как ожидалось.

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

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

+0

Проблема заключается в том, что функция последовательной записи (используемый печати) возвращает немедленно, если он сумеет положить байт в буфере последовательного, в противном случае блоки до тех пор, пока по крайней мере, одно место в буфере. Поэтому, очевидно, вы пишете слишком много данных в сериале. Обходные пути: 1) увеличить серийную скорость (более высокая скорость -> более низкое время для отправки); 2) разделяет функции печати в разных функциях, вызываемых в разное время; 3) создать большой массив и заполнить его; затем периодически пытайтесь очистить некоторые байты от него через последовательный интерфейс ... – frarugi87

+0

... Проверьте функцию [AvailableForWrite()] (https://www.arduino.cc/en/Serial/AvailableForWrite), которая есть там помогите вам сделать неблокирующую серийную запись. Или, если вам нужно всегда отправлять одни и те же данные, создайте конечный автомат, чтобы лучше контролировать отправку. – frarugi87

+1

@ frarugi87 Контроль количества отправляемых данных, безусловно, помог! – charley

ответ

1

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

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

Йоав

 Смежные вопросы

  • Нет связанных вопросов^_^