Diferencia entre revisiones de «Serial»
(→Serial.findUntil()) |
(→Referencias) |
||
(No se muestran 40 ediciones intermedias de 2 usuarios) | |||
Línea 1: | Línea 1: | ||
+ | Implementación en forma de objeto utilizada para simplificar el uso del puerto serial (USART) por hardware. Se usa para la comunicación entre la placa Arduino y una computadora u otros dispositivos. | ||
− | + | Todas las placas Arduino tienen al menos un puerto serie. En el caso del ATmega328P ([[UNO]], [[NANO]], [[MINI]]), solo tiene uno y se conecta a los pines 0 y 1; mientras que el ATmega2560 ([[MEGA]]) tiene cuatro, y sus pines están demarcados en la placa. Por lo tanto, si requiere usar USB no puede usar los pines 0 y 1 para entrada o salida digital.<br> | |
− | + | Cuando el microcontrolador posee más de un puerto serial por hardware, las respectivas instancias se pueden diferenciar mediante el número al final del nombre. Por ejemplo, el Arduino [[MEGA]] tiene: '''Serial''' (este es el que también va al USB), '''Serial1''', '''Serial2''' y '''Serial3'''; cada una para manipular un puerto distinto. | |
− | + | Esta clase hereda de [[Stream]]; por lo tanto todas sus funciones se pueden utilizar aquí también. | |
− | + | {{Nota|Puede usar el monitor serie integrado del [[IDE]] Arduino para comunicarse con una placa Arduino. Haga clic en el botón del monitor serie en la barra de herramientas y seleccione la misma velocidad en baudios que introdujo en [[Serial.begin()]].}} | |
− | + | {{Nota|El flujo de entrada y salida de esta clase se categorizan como '''byte a byte asincrónico'''.}} | |
− | |||
− | + | == Metodos == | |
− | + | {|class="wikitable" | |
− | + | |+Metodos disponibles para Serial | |
− | + | |- | |
− | + | !Método!!Descripción | |
− | } | + | |- |
− | + | |[[Serial.begin()]]||Abre el puerto serie, fija su configuración y velocidad de comunicación. | |
+ | |- | ||
+ | |[[Serial.setTimeout()]]||Cambia el tiempo de espera (de la llegada de nuevos datos). | ||
+ | |- | ||
+ | |[[Serial.getTimeout()]]||Retorna el tiempo de espera actualmente configurado. | ||
+ | |- | ||
+ | |[[Serial.available()]]||Indica el numero de bytes/caracteres disponibles para lectura. | ||
+ | |- | ||
+ | |[[Serial.read()]]||Lee un carácter disponible y lo borra del buffer. | ||
+ | |- | ||
+ | |[[Serial.readBytes()]]||Lee uno o más bytes desde el puerto serie, y los almacena en el buffer/vector/matriz espeficificado. | ||
+ | |- | ||
+ | |[[Serial.readBytesUntil()]]||Similar al anterior, excepto que con la posibilidad de además finalizar con un terminador. | ||
+ | |- | ||
+ | |[[Serial.readString()]]||Convierte el flujo de entrada en un objeto [[String]]. | ||
+ | |- | ||
+ | |[[Serial.readStringUntil()]]||Similar al anterior, excepto que con la posibilidad de además finalizar con un terminador. | ||
+ | |- | ||
+ | |[[Serial.peek()]]||Lee un carácter disponible pero queda disponible en el buffer (no borra). | ||
+ | |- | ||
+ | |[[Serial.write()]]||Envia datos binarios al puerto serie. | ||
+ | |- | ||
+ | |[[Serial.availableForWrite()]]||Indica el numero de caracteres que todavía están pendientes de transmitirse. | ||
+ | |- | ||
+ | |[[Serial.print()]]||Imprime una representación textual de un dato. | ||
+ | |- | ||
+ | |[[Serial.println()]]||Imprime una representación textual de un dato junto con un salto de línea; o solo este último. | ||
+ | |- | ||
+ | |[[Serial.flush()]]||Bloquea la ejecución hasta que el buffer de salida se haya vaciado. | ||
+ | |- | ||
+ | |[[Serial.find()]]||Lee datos hasta encontrar una coincidencia con una cadena de caracteres o bytes. | ||
+ | |- | ||
+ | |[[Serial.findUntil()]]||Similar al anterior, excepto que con la posibilidad de además finalizar con una cadena terminadora. | ||
+ | |- | ||
+ | |[[Serial.parseInt()]]||Convierte el flujo de entrada en un valor entero [[int]]. | ||
+ | |- | ||
+ | |[[Serial.parseFloat()]]||Convierte el flujo de entrada en un valor punto flotante [[float]]. | ||
+ | |- | ||
+ | |[[Serial.end()]]||Desactiva la comunicación y libera los pines Rx y Tx asociados. | ||
+ | |} | ||
− | == | + | == Comentarios == |
− | + | * En el [[IDE]] hay una pantalla que se llama el '''Monitor serie''' donde se puede hacer que Arduino escriba cosas (vía [[Serial.print()]] o [[Serial.write()]]), pero también se puede enviar datos hacia Arduino (desde la primera linea) que luego se puede capturar en Arduino con [[Serial.read()]]. | |
− | + | * No es muy conocido, pero todas las funciones de escritura y las de lectura a múltiples bytes, en realidad retornan un valor entero: la cantidad real de bytes que fueron escritos o leídos con éxito. | |
+ | * [[Serial.parseInt()]] y [[Serial.parseFloat()]] opcionalmente pueden recibir un [[char]], este se usará para excluirlo de los caracteres inválidos (que obligan a terminar la conversión), pero sin afectar la conversión. Útil para números separados en milésimas (ej.: "1 000 000"). En [[Serial.parseFloat()]] no se debe ingresar el punto ('''.'''); de lo contrario fallará en reconocer las cifras decimales. | ||
− | + | {| class="wikitable" | |
− | Serial.print( | + | |+ATmega 328 a 16 MHz |
− | + | |- | |
+ | ! Comando !! ciclos CPU | ||
+ | |- | ||
+ | | Serial.print("Hola mundo") con buffer libre || 9600 baud = 1816 / 115200 baud = 1904 | ||
+ | |- | ||
+ | | Serial.print("Hola mundo") con buffer lleno || 9600 baud = 183021 / 115200 baud = 14941 | ||
+ | |- | ||
+ | | Serial.write() con buffer libre || 9600 baud = 154 / 115200 baud = 162 | ||
+ | |- | ||
+ | | Serial.write() con buffer lleno || 9600 baud = 16621 / 115200 baud = 1338 | ||
+ | |} | ||
− | + | == Advertencias == | |
− | + | * Desde [[IDE]] v1.0 la transmision en serie es asincrona. | |
− | + | * Arduino [[UNO]] y [[MINI]] solo tiene un puerto Serie implementado por hardware en los pines digitales 0 (Rx) y 1 (Tx). No se recomienda usar los pines digitales 0 (Rx) y 1 (Tx) para entrada o salida si requerirás usar el monitor serie. | |
− | + | * Arduino [[MEGA]] y [[DUO]] tiene 4 puertos serie implementados por hardware. | |
− | + | * La comunicación serial en los pines Tx / Rx usa niveles lógicos TTL (5V o 3V3 dependiendo de la placa). No conecte estos pines directamente a un puerto serial RS232; funcionan a +/- 12V y pueden dañar su placa Arduino. Puedes usar el IC MAX3222. | |
− | + | * Si necesitas mas puertos los puedes implementar por software con la librería '''SoftwareSerial.h'''. Posee las mismas funciones antes descritas (también hereda de [[Stream]]). | |
− | + | * Hay un "bug" o fallo con [[Serial.readString()]] y [[Serial.readStringUntil()]]: si el flujo de entrada es constante (tiempo de espera nunca se agota) y se llama a alguna de estas funciones, se corre el riesgo de colgar completamente el programa. La razón se debe a que, conceptualmente, [[String]] es ilimitado en tamaño; pero como la [[SRAM]] no es así, eventualmente el programa llegará a colapsar. | |
− | Serial. | + | * Si requiere usar USB no puede usar los pines 0 y 1 para entrada o salida digital. |
− | Serial. | ||
− | |||
− | + | == Vea también == | |
− | + | * [[SoftwareSerial]] | |
− | + | * [[sprintf()]] | |
− | + | <categorytree mode=all>Serial</categorytree> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | == Vea también | ||
− | * [[ | ||
− | * [[ | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
== Referencias == | == Referencias == | ||
− | * [https://www.arduino.cc/reference/en/language/functions/communication/serial/ | + | * [https://www.arduino.cc/reference/en/language/functions/communication/serial/ Guía de referencia] |
+ | * [https://www.luisllamas.es/puerto-serie-avanzado-arduino/ Comunicación avanzada por puerto serie] - Luis Llamas | ||
+ | * [https://www.luisllamas.es/estructuras-puerto-serie-arduino/ Enviar un objeto o estructura por puerto serie] - Luis Llamas | ||
+ | * [https://www.luisllamas.es/arduino-caracteres-control-puerto-serie/ Caracteres de control en puerto serie] - Luis Llamas | ||
+ | * [https://www.luisllamas.es/array-puerto-serie-arduino/ Enviar o recibir una matriz por puerto serie] - Luis Llamas | ||
+ | * [https://www.luisllamas.es/arduino-bytes-puerto-serie/ Enviar o recibir bytes por puerto serie] - Luis Llamas | ||
+ | * [https://aprendiendoarduino.wordpress.com/tag/rs232/ Comunicación serie Arduino] - Enrique Crespo | ||
+ | * [https://naylampmechatronics.com/blog/24_configuracion-del-modulo-bluetooth-hc-05-usa.html Bluetooth HC-05] - Naylamp | ||
+ | * [https://itp.nyu.edu/physcomp/lessons/serial-communication/serial-communication-the-basics/ Serial communication] - ITP Informatica Fisica | ||
+ | * [http://diymakers.es/usando-el-puerto-serie-del-arduino/ Usando el puerto serie del Arduino] - Diy Makers | ||
− | [[Category: | + | [[Category:Serial]] |
Revisión actual del 16:33 4 jul 2019
Implementación en forma de objeto utilizada para simplificar el uso del puerto serial (USART) por hardware. Se usa para la comunicación entre la placa Arduino y una computadora u otros dispositivos.
Todas las placas Arduino tienen al menos un puerto serie. En el caso del ATmega328P (UNO, NANO, MINI), solo tiene uno y se conecta a los pines 0 y 1; mientras que el ATmega2560 (MEGA) tiene cuatro, y sus pines están demarcados en la placa. Por lo tanto, si requiere usar USB no puede usar los pines 0 y 1 para entrada o salida digital.
Cuando el microcontrolador posee más de un puerto serial por hardware, las respectivas instancias se pueden diferenciar mediante el número al final del nombre. Por ejemplo, el Arduino MEGA tiene: Serial (este es el que también va al USB), Serial1, Serial2 y Serial3; cada una para manipular un puerto distinto.
Esta clase hereda de Stream; por lo tanto todas sus funciones se pueden utilizar aquí también.
Nota: Puede usar el monitor serie integrado del IDE Arduino para comunicarse con una placa Arduino. Haga clic en el botón del monitor serie en la barra de herramientas y seleccione la misma velocidad en baudios que introdujo en Serial.begin().
Nota: El flujo de entrada y salida de esta clase se categorizan como byte a byte asincrónico.
Metodos
Método | Descripción |
---|---|
Serial.begin() | Abre el puerto serie, fija su configuración y velocidad de comunicación. |
Serial.setTimeout() | Cambia el tiempo de espera (de la llegada de nuevos datos). |
Serial.getTimeout() | Retorna el tiempo de espera actualmente configurado. |
Serial.available() | Indica el numero de bytes/caracteres disponibles para lectura. |
Serial.read() | Lee un carácter disponible y lo borra del buffer. |
Serial.readBytes() | Lee uno o más bytes desde el puerto serie, y los almacena en el buffer/vector/matriz espeficificado. |
Serial.readBytesUntil() | Similar al anterior, excepto que con la posibilidad de además finalizar con un terminador. |
Serial.readString() | Convierte el flujo de entrada en un objeto String. |
Serial.readStringUntil() | Similar al anterior, excepto que con la posibilidad de además finalizar con un terminador. |
Serial.peek() | Lee un carácter disponible pero queda disponible en el buffer (no borra). |
Serial.write() | Envia datos binarios al puerto serie. |
Serial.availableForWrite() | Indica el numero de caracteres que todavía están pendientes de transmitirse. |
Serial.print() | Imprime una representación textual de un dato. |
Serial.println() | Imprime una representación textual de un dato junto con un salto de línea; o solo este último. |
Serial.flush() | Bloquea la ejecución hasta que el buffer de salida se haya vaciado. |
Serial.find() | Lee datos hasta encontrar una coincidencia con una cadena de caracteres o bytes. |
Serial.findUntil() | Similar al anterior, excepto que con la posibilidad de además finalizar con una cadena terminadora. |
Serial.parseInt() | Convierte el flujo de entrada en un valor entero int. |
Serial.parseFloat() | Convierte el flujo de entrada en un valor punto flotante float. |
Serial.end() | Desactiva la comunicación y libera los pines Rx y Tx asociados. |
Comentarios
- En el IDE hay una pantalla que se llama el Monitor serie donde se puede hacer que Arduino escriba cosas (vía Serial.print() o Serial.write()), pero también se puede enviar datos hacia Arduino (desde la primera linea) que luego se puede capturar en Arduino con Serial.read().
- No es muy conocido, pero todas las funciones de escritura y las de lectura a múltiples bytes, en realidad retornan un valor entero: la cantidad real de bytes que fueron escritos o leídos con éxito.
- Serial.parseInt() y Serial.parseFloat() opcionalmente pueden recibir un char, este se usará para excluirlo de los caracteres inválidos (que obligan a terminar la conversión), pero sin afectar la conversión. Útil para números separados en milésimas (ej.: "1 000 000"). En Serial.parseFloat() no se debe ingresar el punto (.); de lo contrario fallará en reconocer las cifras decimales.
Comando | ciclos CPU |
---|---|
Serial.print("Hola mundo") con buffer libre | 9600 baud = 1816 / 115200 baud = 1904 |
Serial.print("Hola mundo") con buffer lleno | 9600 baud = 183021 / 115200 baud = 14941 |
Serial.write() con buffer libre | 9600 baud = 154 / 115200 baud = 162 |
Serial.write() con buffer lleno | 9600 baud = 16621 / 115200 baud = 1338 |
Advertencias
- Desde IDE v1.0 la transmision en serie es asincrona.
- Arduino UNO y MINI solo tiene un puerto Serie implementado por hardware en los pines digitales 0 (Rx) y 1 (Tx). No se recomienda usar los pines digitales 0 (Rx) y 1 (Tx) para entrada o salida si requerirás usar el monitor serie.
- Arduino MEGA y DUO tiene 4 puertos serie implementados por hardware.
- La comunicación serial en los pines Tx / Rx usa niveles lógicos TTL (5V o 3V3 dependiendo de la placa). No conecte estos pines directamente a un puerto serial RS232; funcionan a +/- 12V y pueden dañar su placa Arduino. Puedes usar el IC MAX3222.
- Si necesitas mas puertos los puedes implementar por software con la librería SoftwareSerial.h. Posee las mismas funciones antes descritas (también hereda de Stream).
- Hay un "bug" o fallo con Serial.readString() y Serial.readStringUntil(): si el flujo de entrada es constante (tiempo de espera nunca se agota) y se llama a alguna de estas funciones, se corre el riesgo de colgar completamente el programa. La razón se debe a que, conceptualmente, String es ilimitado en tamaño; pero como la SRAM no es así, eventualmente el programa llegará a colapsar.
- Si requiere usar USB no puede usar los pines 0 y 1 para entrada o salida digital.
Vea también
Referencias
- Guía de referencia
- Comunicación avanzada por puerto serie - Luis Llamas
- Enviar un objeto o estructura por puerto serie - Luis Llamas
- Caracteres de control en puerto serie - Luis Llamas
- Enviar o recibir una matriz por puerto serie - Luis Llamas
- Enviar o recibir bytes por puerto serie - Luis Llamas
- Comunicación serie Arduino - Enrique Crespo
- Bluetooth HC-05 - Naylamp
- Serial communication - ITP Informatica Fisica
- Usando el puerto serie del Arduino - Diy Makers