Main Content

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.