{"id":433,"date":"2023-05-22T08:03:00","date_gmt":"2023-05-22T07:03:00","guid":{"rendered":"https:\/\/jorgeturiel.es\/?p=433"},"modified":"2023-04-16T22:05:18","modified_gmt":"2023-04-16T21:05:18","slug":"comunicando-lazarus-free-pascal-con-arduino-parte-2","status":"publish","type":"post","link":"https:\/\/jorgeturiel.es\/?p=433","title":{"rendered":"Comunicando Lazarus Free Pascal con Arduino (Parte 2)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Seguimos comunicando nuestra aplicaci\u00f3n escrita en Lazarus, con una placa Arduino, usando el puerto Serie. En el <a href=\"https:\/\/teisrobotics.org\/?p=91\">post anterior<\/a> de esta serie hab\u00edamos construido una aplicaci\u00f3n para recibir datos desde nuestro Arduino.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora vamos a construir una aplicaci\u00f3n para enviar datos.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\">Realizaremos una aplicaci\u00f3n d\u00f3nde le enviaremos un texto a nuestra placa Arduino, y esta nos contestar\u00e1 diciendo que ha recibido el texto, adem\u00e1s de devolvernos el texto enviado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Creando la aplicaci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Empieza creando una aplicaci\u00f3n como has hecho hasta ahora. En la parte superior a\u00f1ade un componente <em>TPanel<\/em>.  Borrar el contenido de su propiedad <em>Caption<\/em>. Su propiedad <em>Align<\/em> aj\u00fastala a <em>alTop<\/em> para que siempre est\u00e9 en la parte superior de la ventana.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A\u00f1ade un componente <em>TMemo <\/em> y cambia su propiedad <em>Align<\/em> al valor <em>alClient<\/em> para que ocupe el espacio restante de la ventana. Tambi\u00e9n pon su propiedad <em>ScrollBars<\/em> al valor <em>ssAutoBoth <\/em> para que muestre barras de desplazamiento si las necesita, seg\u00fan se llene de texto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Coloca, por suesto el componente <em>TLazSerial.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora a\u00f1ade tres <em>TButon<\/em> sobre el componente <em>TPanel<\/em> que pusimos antes. N\u00f3mbralos como <em>btConectar, btConfigurar, btEnviar.<\/em> Y en sus propiedad <em>Caption<\/em> ponles lo siguiente: Conectar, Configurar, Enviar. Adem\u00e1s a\u00f1ade un componente <em>TEdit<\/em>, y ajusta su propiedad <em>Name<\/em> con el valor <em>edTexto<\/em>, y borrar el contenido de su propiedad <em>Text.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Coloca los componentes como se muestra en la imagen siguiente:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" src=\"https:\/\/teisrobotics.org\/wp-content\/uploads\/2020\/05\/primera.png\" alt=\"\" class=\"wp-image-189\"\/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Pon la propiedad <em>Enabled<\/em> al valor <em>False<\/em>, del bot\u00f3n <em>BtEnviar<\/em>, y del componente <em>TEdit.<\/em> De esta manera cuando la aplicaci\u00f3n se ejecute, los componentes estar\u00e1n desactivados y no funcionar\u00e1n. Ya que el bot\u00f3n de enviar, as\u00ed como el componente Tedit, solo deber\u00e1n estar activos cuando est\u00e9 la aplicaci\u00f3n conectada al Arduino.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As\u00ed que el c\u00f3digo del evento <em>OnClick,<\/em> del bot\u00f3n Conectar, se encargar\u00e1 de iniciar la conexi\u00f3n serie y activar los controles que tenemos desactivados. <\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">procedure Tmainfrm.btConectarClick(Sender: TObject);\nbegin\n    LazSerial1.Active := True;\n    edtexto.Enabled := True;\n    btEnviar.Enabled := True;\nend;  <\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora debemos usar el evento <em>Onclick<\/em> del bot\u00f3n Enviar para enviar al Arduino, el texto que tenemos en el componente <em>TEdit.<\/em><\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:default decode:true \">procedure Tmainfrm.btEnviarClick(Sender: TObject);\nbegin\n   LazSerial1.WriteData(edtexto.Text);\nend;  <\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">El evento <em>OnClick<\/em> del bot\u00f3n configurar ser\u00e1 igual que el que hicimos en la entrada anterior.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">procedure Tmainfrm.btConfigurarClick(Sender: TObject);\nbegin\n  LazSerial1.ShowSetupDialog;\nend;<\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Ya solo queda escribir el c\u00f3digo para recibir la informaci\u00f3n de la placa Arduino. Esto se realiza en el evento <em>Serial1RxData<\/em> del componente TLazSerial. Dentro de este evento debemos capturar la informaci\u00f3n que nos env\u00eda Arduino por el puerto serie, y escribirla en el TMemo <em>mmRecibir<\/em>. El c\u00f3digo ser\u00eda el siguiente:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">procedure Tmainfrm.LazSerial1RxData(Sender: TObject);\nbegin\n  mnRecibir.Lines.add (LazSerial1.ReadData);\nend;   <\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">C\u00f3digo del Arduino<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El c\u00f3digo fuente del Arduino es muy sencillo, ya que solamente capturaremos el texto recibido. Sabemos que se el texto est\u00e1 completo por que se recibe el car\u00e1cter salto de l\u00ednea y le a\u00f1adiremos la frase: <em>\u00ab<\/em>Hola, he recibido esto:\u00bb.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Este es el c\u00f3digo fuente del Arduino:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:c decode:true \">void setup() {\n  Serial.begin(9600);\n}\nvoid loop() {\n   if (Serial.available())\n  {\n    String cadena = Serial.readStringUntil('\\n');\n    String enviar = \"Hola, he recibido esto: \" + cadena;\n    Serial.println(enviar);    \n  }\n}<\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Puliendo detalles.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si te fijas el texto que captura nuestra aplicaci\u00f3n no aparece en una sola l\u00ednea. Esto es debido a que tal como llegan la informaci\u00f3n la escribimos sin esperar al final de l\u00ednea.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" src=\"https:\/\/teisrobotics.org\/wp-content\/uploads\/2020\/05\/segunda.png\" alt=\"\" class=\"wp-image-195\"\/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para solucionar esto, debemos enviar un final de l\u00ednea desde Arduino, y capturarlo en nuestra aplicaci\u00f3n. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El c\u00f3digo en Arduino ser\u00eda el siguiente:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:c decode:true \">void setup() {\n  Serial.begin(9600);\n}\nvoid loop() {\n   if (Serial.available())\n  {\n    String cadena = Serial.readStringUntil('\\n');\n    String enviar = \"Hola, he recibido esto: \" + cadena+'\\n'; \/\/A\u00f1adimos final de l\u00ednea\n    Serial.println(enviar);    \n  }\n}<\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Y en el evento <em>LazSerial1RxData<\/em>, lo modificamos, de modo que iremos guardando la informaci\u00f3n recibida en una variable llamada Texto, que hemos definido en la secci\u00f3n <em>Private<\/em> de nuestro aplicaci\u00f3n, de manera que est\u00e1 disponible para todo el formulario.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">private\n    Texto: string; \/\/Variable para almacenar datos recibidos   <\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Si el \u00faltimo car\u00e1cter de la cadena es un retorno de carro, o un salto de l\u00ednea, a\u00f1adiremos una l\u00ednea en el componente <em>mmRecibir<\/em> con el contenido de Texto. Y luego borraremos su contenido.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">procedure Tmainfrm.LazSerial1RxData(Sender: TObject);\nvar\n  Str: string;\nbegin\n  str := LazSerial1.ReadData;\n  if Length(str) &gt; 1 then\n  begin\n    Texto := texto + str;\n    if (Texto[Length(Texto)] = #13) or (Texto[Length(Texto)] = #10) then\n    begin\n      mnRecibir.Lines.add(texto);\n      Texto := '';\n    end;\n  end;\nend;  <\/pre><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code><pre class=\"wp-block-syntaxhighlighter-code\"><\/pre><\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" src=\"https:\/\/teisrobotics.org\/wp-content\/uploads\/2020\/05\/tercera.png\" alt=\"\" class=\"wp-image-197\"\/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Con esto tenemos nuestra aplicaci\u00f3n lista. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Saludos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Seguimos comunicando nuestra aplicaci\u00f3n escrita en Lazarus, con una placa Arduino, usando el puerto Serie. En el post anterior de esta serie hab\u00edamos construido una aplicaci\u00f3n para recibir datos desde nuestro Arduino. Ahora vamos a construir una aplicaci\u00f3n para enviar datos.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[44,27,25],"tags":[45,47,23,21],"class_list":["post-433","post","type-post","status-publish","format-standard","hentry","category-arduino","category-lazarus","category-pascal","tag-arduino","tag-comunicacion","tag-lazarus","tag-pascal"],"_links":{"self":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts\/433","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=433"}],"version-history":[{"count":2,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts\/433\/revisions"}],"predecessor-version":[{"id":436,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts\/433\/revisions\/436"}],"wp:attachment":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=433"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=433"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=433"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}