Seguimos comunicando nuestra aplicación escrita en Lazarus, con una placa Arduino, usando el puerto Serie. En el post anterior de esta serie habíamos construido una aplicación para recibir datos desde nuestro Arduino.
Ahora vamos a construir una aplicación para enviar datos.
Realizaremos una aplicación dónde le enviaremos un texto a nuestra placa Arduino, y esta nos contestará diciendo que ha recibido el texto, además de devolvernos el texto enviado.
Creando la aplicación
Empieza creando una aplicación como has hecho hasta ahora. En la parte superior añade un componente TPanel. Borrar el contenido de su propiedad Caption. Su propiedad Align ajústala a alTop para que siempre esté en la parte superior de la ventana.
Añade un componente TMemo y cambia su propiedad Align al valor alClient para que ocupe el espacio restante de la ventana. También pon su propiedad ScrollBars al valor ssAutoBoth para que muestre barras de desplazamiento si las necesita, según se llene de texto.
Coloca, por suesto el componente TLazSerial.
Ahora añade tres TButon sobre el componente TPanel que pusimos antes. Nómbralos como btConectar, btConfigurar, btEnviar. Y en sus propiedad Caption ponles lo siguiente: Conectar, Configurar, Enviar. Además añade un componente TEdit, y ajusta su propiedad Name con el valor edTexto, y borrar el contenido de su propiedad Text.
Coloca los componentes como se muestra en la imagen siguiente:
Pon la propiedad Enabled al valor False, del botón BtEnviar, y del componente TEdit. De esta manera cuando la aplicación se ejecute, los componentes estarán desactivados y no funcionarán. Ya que el botón de enviar, así como el componente Tedit, solo deberán estar activos cuando esté la aplicación conectada al Arduino.
Así que el código del evento OnClick, del botón Conectar, se encargará de iniciar la conexión serie y activar los controles que tenemos desactivados.
1 2 3 4 5 6 |
procedure Tmainfrm.btConectarClick(Sender: TObject); begin LazSerial1.Active := True; edtexto.Enabled := True; btEnviar.Enabled := True; end; |
Ahora debemos usar el evento Onclick del botón Enviar para enviar al Arduino, el texto que tenemos en el componente TEdit.
1 2 3 4 |
procedure Tmainfrm.btEnviarClick(Sender: TObject); begin LazSerial1.WriteData(edtexto.Text); end; |
El evento OnClick del botón configurar será igual que el que hicimos en la entrada anterior.
1 2 3 4 |
procedure Tmainfrm.btConfigurarClick(Sender: TObject); begin LazSerial1.ShowSetupDialog; end; |
Ya solo queda escribir el código para recibir la información de la placa Arduino. Esto se realiza en el evento Serial1RxData del componente TLazSerial. Dentro de este evento debemos capturar la información que nos envía Arduino por el puerto serie, y escribirla en el TMemo mmRecibir. El código sería el siguiente:
1 2 3 4 |
procedure Tmainfrm.LazSerial1RxData(Sender: TObject); begin mnRecibir.Lines.add (LazSerial1.ReadData); end; |
Código del Arduino
El código fuente del Arduino es muy sencillo, ya que solamente capturaremos el texto recibido. Sabemos que se el texto está completo por que se recibe el carácter salto de línea y le añadiremos la frase: «Hola, he recibido esto:».
Este es el código fuente del Arduino:
1 2 3 4 5 6 7 8 9 10 11 |
void setup() { Serial.begin(9600); } void loop() { if (Serial.available()) { String cadena = Serial.readStringUntil('\n'); String enviar = "Hola, he recibido esto: " + cadena; Serial.println(enviar); } } |
Puliendo detalles.
Si te fijas el texto que captura nuestra aplicación no aparece en una sola línea. Esto es debido a que tal como llegan la información la escribimos sin esperar al final de línea.
Para solucionar esto, debemos enviar un final de línea desde Arduino, y capturarlo en nuestra aplicación.
El código en Arduino sería el siguiente:
1 2 3 4 5 6 7 8 9 10 11 |
void setup() { Serial.begin(9600); } void loop() { if (Serial.available()) { String cadena = Serial.readStringUntil('\n'); String enviar = "Hola, he recibido esto: " + cadena+'\n'; //Añadimos final de línea Serial.println(enviar); } } |
Y en el evento LazSerial1RxData, lo modificamos, de modo que iremos guardando la información recibida en una variable llamada Texto, que hemos definido en la sección Private de nuestro aplicación, de manera que está disponible para todo el formulario.
1 2 |
private Texto: string; //Variable para almacenar datos recibidos |
Si el último carácter de la cadena es un retorno de carro, o un salto de línea, añadiremos una línea en el componente mmRecibir con el contenido de Texto. Y luego borraremos su contenido.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
procedure Tmainfrm.LazSerial1RxData(Sender: TObject); var Str: string; begin str := LazSerial1.ReadData; if Length(str) > 1 then begin Texto := texto + str; if (Texto[Length(Texto)] = #13) or (Texto[Length(Texto)] = #10) then begin mnRecibir.Lines.add(texto); Texto := ''; end; end; end; |
1 |
<pre class="wp-block-syntaxhighlighter-code"> |
Con esto tenemos nuestra aplicación lista.
Saludos.