Leer datos de transmisión desde Arduino usando la comunicación de puertos serie
Este ejemplo muestra cómo habilitar callbacks para leer datos de transmisión terminados en ASCII desde un Arduino®
Due usando la interfaz serialport
.
Cargar programa en el Arduino
Conecte un Arduino Due a su ordenador.
Cargue el siguiente programa en el Arduino Due usando el Arduino IDE. Este programa escribe puntos continuos de una onda sinusoidal, seguidos de los terminadores "Retorno de carro" y "Salto de línea".
/* 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; }
Establecer una conexión con el Arduino
Cree una instancia serialport
para conectarse a su Arduino Due.
Encuentre el puerto serie al que está conectado el Arduino. Puede identificar el puerto desde el Arduino IDE.
serialportlist("available")'
ans = 3×1 string
"COM1"
"COM3"
"COM13"
Conéctese al Arduino Due creando un objeto serialport
usando el puerto y la tasa de transmisión especificada en el código de Arduino.
arduinoObj = serialport("COM13",9600)
arduinoObj = Serialport with properties Port: "COM13" BaudRate: 9600 NumBytesAvailable: 0 NumBytesWritten: 0 Show all properties
Prepare el objeto serialport
para empezar a transmitir datos.
Configure el objeto serialport
eliminando datos antiguos y configurando sus propiedades.
Defina la propiedad Terminator
para que coincida con el terminador que especificó en el código de Arduino.
configureTerminator(arduinoObj,"CR/LF");
Vacíe el objeto serialport
para eliminar cualquier dato antiguo.
flush(arduinoObj);
Prepare la propiedad UserData
para almacenar los datos de Arduino. El campo Data
de la estructura guarda el valor de la onda sinusoidal y el campo Count
guarda el valor del eje x de la onda sinusoidal.
arduinoObj.UserData = struct("Data",[],"Count",1)
arduinoObj = Serialport with properties Port: "COM13" BaudRate: 9600 NumBytesAvailable: 10626 NumBytesWritten: 0 Show all properties
Cree una función de callback readSineWaveData
que lea los primeros 1000 puntos de datos terminados ASCII de la onda sinusoidal y represente el resultado.
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
Defina la propiedad BytesAvailableFcnMode
como "terminator
" y la propiedad BytesAvailableFcn
como @readSineWaveData
. La función de callback readSineWaveData
se activa cuando hay nuevos datos de onda sinusoidal (con el terminador) disponibles para su lectura en el Arduino.
configureCallback(arduinoObj,"terminator",@readSineWaveData);
La función de callback abre la ventana de la figura de MATLAB®
con una gráfica de los primeros 1000 puntos de datos de la onda sinusoidal.