Мы используем 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, производит тайминги, так как без нее частота будет такой, как ожидалось.
Кто-нибудь знает какие-либо решения? Регистрация данных и построение графика в реальном времени важны и не могут быть скомпрометированы.
Заранее спасибо
Проблема заключается в том, что функция последовательной записи (используемый печати) возвращает немедленно, если он сумеет положить байт в буфере последовательного, в противном случае блоки до тех пор, пока по крайней мере, одно место в буфере. Поэтому, очевидно, вы пишете слишком много данных в сериале. Обходные пути: 1) увеличить серийную скорость (более высокая скорость -> более низкое время для отправки); 2) разделяет функции печати в разных функциях, вызываемых в разное время; 3) создать большой массив и заполнить его; затем периодически пытайтесь очистить некоторые байты от него через последовательный интерфейс ... – frarugi87
... Проверьте функцию [AvailableForWrite()] (https://www.arduino.cc/en/Serial/AvailableForWrite), которая есть там помогите вам сделать неблокирующую серийную запись. Или, если вам нужно всегда отправлять одни и те же данные, создайте конечный автомат, чтобы лучше контролировать отправку. – frarugi87
@ frarugi87 Контроль количества отправляемых данных, безусловно, помог! – charley