Последовательный интерфейс Matlab с Arduino очень медленный
Я пытаюсь установить последовательную связь в Matlab с платой Arduino. Чтение данных с доски идет хорошо. Однако запись данных на доску занимает около секунды для каждого блока информации, который я отправляю.
Код, который я запускаю для записи данных:
s = serial(comprt,'BaudRate',9600,'DataBits',8);
fopen(s);
fprintf(s, '%c', 'c');
fprintf(s, '%u %u %u %u \n', [A B C D]);
pause(1);
fprintf(s, '%c', 'a');
pause(1);
A, B, C, D - это 8-битные числа в диапазоне от 0 до 255, "c" и "a" - это команды символов, которые работают на плате Arduino и подключаются к микропрограммному обеспечению на плате.
Если я не включаю команды pause(1), поэтому, когда я не прекращаю выполнение Matlab следующей команды хотя бы на секунду, информация о последовательном соединении не проходит.
Может ли кто-нибудь помочь мне ускорить запись материала на последовательный порт? Я проверил с редактором Arduino, и когда я ввожу эквивалентные команды через их интерфейс, все в порядке. Таким образом, задержки не связаны с платой Arduino или драйверами устройств, это определенно на стороне Matlab.
1 ответ
Я немного использовал MATLAB с Arduino. Пример: см. Здесь ( http://www.instructables.com/id/Arduino-to-MATLAB-GUI-Live-Data-Acquisition-Plotti/) [см. Ссылку в инструкции для моего кода GitHub Arduino и MATLAB] и здесь ( https://www.youtube.com/watch?v=wY3oh2GIfCI).
Я верю, что ваша проблема на вашей стороне Arduino.
Добавьте эту строку в вашу функцию setup():
Serial.setTimeout(100); //this will make the Arduino wait a max of only 100ms per incoming set of serial data, before moving on
Читайте здесь: http://arduino.cc/en/Serial/SetTimeout
Затем постепенно уменьшайте время ожидания, пока не получите плохие результаты, чтобы минимизировать потерянное время ожидания. Затем снова увеличьте его, чтобы убедиться, что он установлен достаточно высоко.
Это быстрый и грязный метод. Как правило, ваш Arduino по умолчанию настроен на ожидание в течение 1 секунды, прежде чем продолжить, после считывания входящих данных.
Лучший способ - использовать завершающий символ. Пример: пусть MATLAB отправляет завершающий символ Newline и использует функцию Arduino Serial.readBytesUntil для чтения до завершающего символа. Тогда тайм-аут последовательного входа никогда не будет достигнут, и вы можете установить тайм-аут снова как длинный (например, 1 сек), фактически не ожидая этой задержки.
Решает ли это вашу проблему? Если это так, пожалуйста, используйте флажок рядом с кнопками голосования, чтобы пометить это как правильный ответ. Благодарю.