В этом примере показано, как включить обратные вызовы для чтения потоковых данных, завершенных ASCII, из Arduino ® благодаря использованию serialport интерфейс.
Подключите Arduino к компьютеру.
Загрузите следующую программу на Arduino Due с помощью Arduino IDE. Эта программа записывает непрерывные точки синусоидальной волны, за которыми следуют терминаторы «Возврат каретки» и «Linefeed».
/*
SineWavePoints
Write sine wave points to the serial port, followed by the Carriage Return and LineFeed terminator.
*/
int i = 0;
// The setup routine runs once when you press reset:
void setup() {
// Initialize serial communication at 9600 bits per second:
Serial.begin(9600);
}
// The loop routine runs over and over again forever:
void loop() {
// Write the sinewave points, followed by the terminator "Carriage Return" and "Linefeed".
Serial.print(sin(i*50.0/360.0));
Serial.write(13);
Serial.write(10);
i += 1;
}
Создать serialport экземпляр для подключения к Arduino Due.
Найдите последовательный порт, к которому подключен Arduino. Порт можно идентифицировать из среды IDE Arduino.
serialportlist("available")'ans = 3×1 string
"COM1"
"COM3"
"COM13"
Подключение к Arduino Due путем создания serialport с использованием порта и скорости передачи в бодах, указанных в коде Arduino.
arduinoObj = serialport("COM13",9600)arduinoObj =
Serialport with properties
Port: "COM13"
BaudRate: 9600
NumBytesAvailable: 0
NumBytesWritten: 0
Show all properties
serialport Объект для запуска потоковой передачи данныхСконфигурируйте serialport путем очистки старых данных и настройки их свойств.
Установите Terminator для соответствия терминатору, указанному в коде Arduino.
configureTerminator(arduinoObj,"CR/LF");Промойте serialport объект для удаления всех старых данных.
flush(arduinoObj);
Подготовьте UserData свойство для хранения данных Arduino. Data поле структуры сохраняет значение синусоидальной волны и Count поле сохраняет значение оси X синусоидальной волны.
arduinoObj.UserData = struct("Data",[],"Count",1)
arduinoObj =
Serialport with properties
Port: "COM13"
BaudRate: 9600
NumBytesAvailable: 10626
NumBytesWritten: 0
Show all properties
Создание функции обратного вызова readSineWaveData считывает первые 1000 точек данных синусоидальных волн с окончанием ASCII и строит график результата.
function readSineWaveData(src, ~) % Read the ASCII data from the serialport object. data = readline(src); % Convert the string data to numeric type and save it in the UserData % property of the serialport object. src.UserData.Data(end+1) = str2double(data); % Update the Count value of the serialport object. src.UserData.Count = src.UserData.Count + 1; % If 1001 data points have been collected from the Arduino, switch off the % callbacks and plot the data. if src.UserData.Count > 1001 configureCallback(src, "off"); plot(src.UserData.Data(2:end)); end end
Установите BytesAvailableFcnMode свойство to "terminator"и BytesAvailableFcn свойство для @readSineWaveData. Функция обратного вызова readSineWaveData запускается, когда новые синусоидальные данные (с терминатором) доступны для чтения из Arduino.
configureCallback(arduinoObj,"terminator",@readSineWaveData);Функция обратного вызова открывает окно изображения MATLAB с графиком первых 1000 точек данных синусоидальной волны.