comunicación serie arduino

Tipo de comunicación

La comunicación es una tecnología utilizada para intercambiar datos entre diferentes dispositivos electrónicos, de hecho, es para realizar el "diálogo de comunicación" entre diferentes dispositivos electrónicos.

imagen-20200925105403249

comunicación serie arduino

Arduino adopta el modo de comunicación USART, que se puede implementar de dos maneras: puerto serie duro y puerto serie suave.

Por lo general, los puertos serie 0 (RX) y 1 (TX) que vienen con Arduino UNO se denominan puertos serie de hardware, que pueden comunicarse con dispositivos de puerto serie periféricos. El puerto serie simulado por la biblioteca de clases SoftwareSerial se denomina puerto serie simulado por software (puerto serie suave para abreviar). Si desea conectar más dispositivos seriales, puede usar el puerto serial suave.

puerto serie duro

La clase de operación del puerto serie duro es HardwareSerial, que se define en el archivo fuente HardwareSerial.h, y declara públicamente el objeto Serial al usuario.El usuario puede llamar directamente a Serial en el programa Arduino para realizar la comunicación en serie.

Las funciones comunes son:

Serial.begin()

  • Descripción: Abre el puerto serial, generalmente ubicado en la función setup().
  • prototipo:
    • Serial.begin(velocidad)
    • Serial.begin (velocidad, configuración)
  • parámetro:
    • velocidad: tasa de baudios, generalmente 9600, 115200, etc.
    • config: establece bits de datos, bits de paridad y bits de parada. El valor predeterminado SERIAL_8N1 significa 8 bits de datos, sin bit de paridad y 1 bit de parada.
  • Valor devuelto: Ninguno.

Serial.end()

  • Descripción: deshabilita la transmisión en serie. En este momento, los puertos seriales Rx y Tx se pueden usar como pines de E/S digitales.
  • Prototipo: Serial.end()
  • Parámetros: Ninguno.
  • Valor devuelto: Ninguno.

Serial.imprimir()

  • Descripción: El puerto serie emite datos y escribe datos de caracteres en el puerto serie.
  • prototipo:
    • Serial.print(val)
    • Serial.print(valor, formato)
  • parámetro:
    • val: El valor impreso, cualquier tipo de dato.
    • config: formato de datos de salida. BIN (binario), OCT (octal), DEC (decimal), HEX (hexadecimal). Para números de punto flotante, este parámetro especifica el número de lugares decimales que se usarán.
  • Ejemplo:
    • Serial.print(78, BIN) obtiene "1001110"
    • Serial.print(78, OCT) obtiene "116"
    • Serial.print(78, DEC) obtiene "78"
    • Serial.print(78, HEX) obtiene "4E"
    • Serial.print(1.23456, 0) obtiene "1"
    • Serial.print(1.23456, 2) obtiene "1.23"
    • Serial.print(1.23456, 4) obtiene "1.2346"
    • Serial.print('N') obtiene "N"
    • Serial.print(“Hola mundo”) 得到 “Hola mundo.”
  • Valor devuelto: Devuelve el número de bytes escritos.

Serial.println()

  • Descripción: El puerto serie emite datos y envuelve la línea.
  • prototipo:
    • Serial.println(val)
    • Serial.println(valor, formato)
  • parámetro:
    • val: El valor impreso, cualquier tipo de dato.
    • config: formato de datos de salida.
  • Valor devuelto: Devuelve el número de bytes escritos.

Serial.disponible()

  • Descripción: juzga el estado del búfer del puerto serie y devuelve el número de bytes leídos del búfer del puerto serie.
  • 原型:Serial.disponible()
  • Parámetros: Ninguno.
  • Valor devuelto: el número de bytes que se pueden leer.

Serie.leer()

  • Descripción: Lea los datos del puerto serie, un carácter a la vez, y elimine los datos leídos después de la lectura.
  • Prototipo: Serial.read()
  • Parámetros: Ninguno.
  • Valor devuelto: Devuelve el primer byte legible en el búfer del puerto serie y devuelve -1 cuando no hay datos legibles, tipo entero.

Referencia de función de operación específica

Experimento 1:

String str="";

void setup() {
  Serial.begin(9600); //set up serial library baud rate to 9600
}

void loop() {
  str = "";
  while (Serial.available() > 0)
  {
    str += char(Serial.read());   // read是剪切,而不是复制
    delay(10);  // 延时
  }
  if (str.length() > 0)
  {
    Serial.print(F("命令行发送内容:"));
    Serial.println(str);
  }
}

Fenómenos experimentales:

imagen-20200925183633274

Experimento 2:

imagen-20200924142248512
/**
 * 通过串口改变Arduino 9号针脚接的LED灯的亮度
 */

int i,j,val; //定义i、j、val三个整型变量
char A[10];  //定义一个无符号数组A

void setup(){
  Serial.begin(9600);
  pinMode(9,OUTPUT);
}

void loop(){
  delay(100);  // 等待100ms

  j = Serial.available();  // 读取串口寄存器中的信息的帧数

  if(j != 0){   // 如果串口寄存器中有数据,那么依次读取这些数据,并存放到数组A中
    for(i = 0; i < j; i++){
      A[i] = Serial.read(); 
    }

    val = strtol(A,NULL,10);  // 将A中的字符转换成十进制数
  }
  analogWrite(9,val); // 将转换好的val输出给三号端口,驱动LED灯的亮度
}

análisis del experimento:

Antes de comprender la comunicación serial de Arduino, debe tener algunos conocimientos previos.

La conexión serial entre la computadora y Arduino es la siguiente:

imagen-20200925214505843

Conecte un registro de puerto serie a la interfaz USB de Arduino para almacenar temporalmente la información de la computadora (el Arduino luego extraerá los datos del registro de puerto serie de acuerdo con el programa del desarrollador y los guardará en la memoria Arduino) y se comunicará con el computadora a través del puerto serie USB. , el espacio de registro del puerto serie asignado a Arduino UNO por defecto puede almacenar 63 marcos de información. (Un marco de información incluye el encabezado del marco, los datos y el final del marco). Si se excede la información, la información detrás se ejecutará sobre la información anterior, lo que provocará la pérdida de información.

La función de lectura lee la información en el registro del puerto serie. Sin embargo, la frecuencia principal de Arduino es 16M, es decir, 1,6 millones de operaciones por segundo; y la velocidad de comunicación en serie (es decir, la tasa de baudios mencionada anteriormente) es generalmente 115200, que es 115200 bits por segundo, que es alrededor de 14400 .bytes Por lo tanto, la velocidad de lectura de Arduino es mucho más rápida que la de la transmisión en serie, y se debe agregar un cierto retraso antes de la lectura.

Ahora supongamos que enviamos tres cuadros de datos desde la computadora a Arduino, los contenidos de estos tres cuadros son 'a', 'b', 'c' respectivamente.

imagen-20200925214112037

En primer lugar, durante el período del paso 1 al paso 4 en el lado derecho, la información ingresa al registro del puerto serie cuadro por cuadro.Si queremos leer toda la información a la vez, entonces durante el período del paso 1 al paso 4 No podemos leer la información, porque la información no se ha transmitido completamente en este momento, es decir, no se ha ingresado toda la información en el registro. Si comenzamos a leer la información en el registro en el paso 2 de la Figura 6, solo obtendremos la información 'a'. Para Arduino, un chip que realiza 1,6 millones de operaciones por segundo, la transmisión de información serial es muy lenta, por lo que debemos establecer un tiempo de espera para Arduino al principio, este tiempo de espera generalmente se establece en 100 ms, razón por la cual agregando el comando delay(100).

Luego, cuando finaliza el tiempo de espera, en este punto consideramos que la información se ha transmitido por completo. Por supuesto, para ser honesto, todo esto son conjeturas. Estimamos que la información se transmite en 100 ms, y la información puede transmitirse tan pronto como 10 ms, pero no importa, preferimos esperar un tiempo para estar seguros. No podemos sentirlo después de esperar decenas de milisegundos. Por supuesto, si está seguro, puede acortar el tiempo de espera, como 50 ms o incluso 20 ms. Puede intentar usarlo. Si no hay pérdida de información, puede puede usar más Tiempo de espera corto. Una vez que la información se transmite por completo, comenzamos a leer la información del registro del puerto serie, es decir, el proceso del paso 5 al paso 7. Tenga en cuenta que la "flecha grande" señalada por la línea negra en la Figura 6 es un puntero dentro del Arduino. Este puntero monitorea el registro del puerto serie en todo momento. Podemos usar el comando Serial.disponible() para movilizar este puntero en cualquier momento. tiempo para obtener la información entrante.Cantidad, por supuesto, como dijimos, tenemos que esperar a que se transmita toda la información antes de comenzar a llamar.Si llamamos a Serial.disponible() en el paso 2, solo podemos detectar un dato . En el paso 4 de la Figura 6, podemos ver que se pasan un total de tres datos al registro, por lo que el valor obtenido al llamar a Serial.disponible() en este momento es 3, y luego asignamos este valor a la variable j, por lo que la variable j representa la cantidad de información en el registro.

Finalmente, este es el puntero. Podemos usar el comando Serial.read() para movilizar este puntero para capturar los datos. Tenga en cuenta que Serial.read() puede capturar un cuadro de información a la vez. Después de capturar la información cada vez, en el registro El espacio donde se almacenó originalmente esta información está vacío, lo que quiero decir es: El comando Serial.read() no copia la información sino que corta la información . Bueno, mirando hacia atrás, se capturan 3 piezas de información 1 a la vez, por lo que para capturar toda la información en el registro, necesitamos capturar 3 veces, por lo que usamos un bucle for, el número de bucles se establece en j , por lo que la información en todos los registros se puede capturar automáticamente. Cada vez que tomamos los datos, los almacenaremos en la matriz A, que es una matriz de caracteres que definimos al comienzo del programa. Hay dos puntos a tener en cuenta sobre la matriz A: 1) Debe definirse como una matriz de caracteres, porque hemos dicho que toda la información que ingresa por el puerto serie de la computadora se transmite en forma de caracteres, incluso si es un árabe. número, es solo un carácter, no un número arábigo real; 2) El tamaño del espacio de la matriz A debe ser suficiente cuando se define. Si planeamos procesar 1 marco de datos a la vez, entonces el espacio de A debe ser dado a 1 cuadro o más; si planeamos procesar 3 cuadros de datos cada vez, entonces el espacio de A debe ser mayor o igual a 3 cuadros. Luego convertimos el "marco" en bytes para definir el espacio de A.

puerto serie suave

La clase de operación del puerto serie suave es SoftwareSerial, que se define en el archivo fuente SoftwareSerial.h, pero a diferencia del puerto serie duro, el objeto del puerto serie suave no se declara en el archivo fuente de antemano, y el objeto del puerto serie suave debe crearse manualmente en el programa Arduino.

Antes de usarlo, debe declarar que el archivo de encabezado SoftwareSerial.h está incluido.

Luego llame al constructor de la clase SoftwareSerial, a través de la cual se pueden especificar los pines RX y TX del puerto serie suave.

SoftwareSerial mySerial= SoftwareSerial(rxPin, txPin)
SoftwareSerial mySerial(rxPin, txPin)
  • mySerial: objeto de puerto serie de software definido por el usuario
  • rxPin: pin de recepción de puerto serie suave
  • txPin: pin de envío de puerto serie suave

Las funciones miembro definidas en la clase SoftwareSerial son similares a los puertos serie de hardware, available(), begin(), read(), write(), print(), println(), peek(), etc. se utilizan en el mismo camino.

Código de prueba:

#include <SoftwareSerial.h> 

//定义管脚2/3分别为RX,TX.  
SoftwareSerial mySerial(2, 3); // RX, TX  
void setup()  
{  
  mySerial.begin(9600);  
}  
void loop()   
{  
   mySerial.println("Hello, world?");     //TX输出
   delay(1000);  
} 

Ejecute el programa, encontrará que el monitor serie no tiene ninguna salida de cadena, ¿por qué es esto?

Como se mencionó en la sección del puerto serial duro, la computadora se comunica con el puerto serial Arduino a través del puerto serial duro TX (1) y RX (0).Cuando usamos el puerto serial suave, la computadora todavía está conectada a estos dos pines. Entonces, incluso si el puerto serie suave TX (3) está emitiendo, la computadora no lo leerá ni lo mostrará. Por lo tanto, conecte el puerto serie duro TX (1) y el puerto serie suave TX (3), de modo que la salida del puerto serie suave TX (3) ingrese al puerto serie duro TX (1), y luego envíelo al computadora.

imagen-20200925184211621

Fenómenos experimentales:

imagen-20200925183752914

Referirse a:

Arduino novato versión popular serie de interpretación (4) comunicación en serie USART

Serie de interpretación de la versión popular de novato de Arduino (7) resumen de los tipos de comunicación

Supongo que te gusta

Origin blog.csdn.net/xiaoshihd/article/details/108805015
Recomendado
Clasificación