<div dir="ltr">hice una prueba<div>Programe un arduino que lea un canal analogico cada 10ms y lo transmite a 115200 baudios y el mismo sin delay, lo que tarda la conversion del canal, aproximadamentes 20us mas la conversion a string deben ser unos 5ms</div><div><br></div><div>Te arme 2 videos donde muestra como resfresca sin dramas.</div><div>10ms</div><div><a href="https://youtu.be/A1Lbltaleko">https://youtu.be/A1Lbltaleko</a><br></div><div><br></div><div>sin delay</div><div><a href="https://youtu.be/SWGooaCWVYM">https://youtu.be/SWGooaCWVYM</a><br></div><div><br></div><div><br></div><div><div>unit pruserial;</div><div><br></div><div>{$mode objfpc}{$H+}</div><div><br></div><div>interface</div><div><br></div><div>uses</div><div> Classes, SysUtils, FileUtil, LazSerial, Forms, Controls, Graphics, Dialogs,</div><div> StdCtrls;</div><div><br></div><div>type</div><div><br></div><div> { TForm1 }</div><div><br></div><div> TForm1 = class(TForm)</div><div> Button1: TButton;</div><div> Edit1: TEdit;</div><div> LazSerial1: TLazSerial;</div><div> procedure Button1Click(Sender: TObject);</div><div> procedure LazSerial1RxData(Sender: TObject);</div><div> private</div><div> { private declarations }</div><div> public</div><div> { public declarations }</div><div> end;</div><div><br></div><div>var</div><div> Form1: TForm1;</div><div><br></div><div>implementation</div><div><br></div><div>{$R *.lfm}</div><div><br></div><div>{ TForm1 }</div><div><br></div><div>procedure TForm1.Button1Click(Sender: TObject);</div><div>begin</div><div> LazSerial1.Open;</div><div>end;</div><div><br></div><div>procedure TForm1.LazSerial1RxData(Sender: TObject);</div><div>begin</div><div> Edit1.Text:= LazSerial1.ReadData;</div><div><br></div><div>end;</div><div><br></div><div>end. </div></div></div><div class="gmail_extra"><br><div class="gmail_quote">El 5 de agosto de 2015, 20:54, Martin Gomez <span dir="ltr"><<a href="mailto:mmgomez@gmail.com" target="_blank">mmgomez@gmail.com</a>></span> escribió:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><div dir="ltr"><div class="gmail_default" style="font-family:tahoma,sans-serif">Con el Sincronize(UpdPeso) tampoco? Eso debería aislarte del multithreading interno de LazSerial (si es que tiene)</div></div></span><div class="gmail_extra"><br><div class="gmail_quote"><div><div class="h5">2015-08-05 13:54 GMT-03:00 francisco prieto <span dir="ltr"><<a href="mailto:fajprieto@gmail.com" target="_blank">fajprieto@gmail.com</a>></span>:<br></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5"><div dir="ltr"><div><div><div>En primer lugar gracias a todos por responder...<br><br></div>En segundo lugar el proceso monitorea con LazSerial el peso en una balanza que escupe muy rapido cada lectura.<br><br></div>En tercer lugar como dije hice el proceso de comunicacion utilizando el evento OnRxData y si envio la data que recibo a un ListBox funciona sin inconvenientes...<br></div><div><br></div><div>El siguiente es el codigo que funciona contra el ListBox.<br><br>procedure TfrmCheck.olePuertoRxData(Sender: TObject);<br>var<br> lcLecturaReal,lcLetra:string;<br> i:integer;<br>begin<br> lcLecturaReal:= olePuerto.ReadData;<br> for i := 1 to Length(lcLecturaReal) do<br> begin<br> lcLetra:=InttoHex(Ord(lcLecturaReal[i]),2);<br> lcLecturaHex := lcLecturaHex + lcLetra+ ' ';<br> case lcLetra of<br> '30'..'39':<br> begin<br> lcLetra:=RightStr(lcLetra,1);<br> lcLecturaTotal := lcLecturaTotal + lcLetra;<br> end;<br> '0D':<br> begin<br> lcLecturaTotal := lcLecturaTotal + 'CR';<br> if (cboBalanza.KeyValue=1) then<br> begin<br> lcLecturaTotal := lcLecturaTotal +'LF';<br> if chkAuditaCom.Checked=True then<br> UpdLog(lcLecturaTotal);<br> lstTrama.Items.Add(lcLecturaTotal);<br> lcLecturaTotal:='';<br> end;<br> end;<br> '0A':<br> begin<br> lcLecturaTotal := lcLecturaTotal +'LF';<br> if chkAuditaCom.Checked=True then<br> UpdLog(lcLecturaTotal);<br> lstTrama.Items.Add(lcLecturaTotal);<br> lcLecturaTotal:='';<br> end;<br> else<br> begin<br> if (lcLetra='02') and (Length(lcLecturaTotal)>0) then<br> begin<br> if chkAuditaCom.Checked=True then<br> UpdLog(lcLecturaTotal);<br> lstTrama.Items.Add(lcLecturaTotal);<br> lcLecturaTotal:='';<br> end;<br> if (lcLetra='02') then<br> lcLetra:='STX'<br> else<br> lcLetra:='|'+lcLetra+'|';<br> lcLecturaTotal := lcLecturaTotal + lcLetra;<br> end;<br> end;<br> end;<br> if chkAuditaCom.Checked=True then<br> UpdLog(lcLecturaHex);<br> edtRecepcion.Lines.Add(lcLecturaHex);<br>end;<br><br></div><div>Es mas si revisan hay un listbox y un memo recibiendo la info al mismo tiempo... pero claro la info en esta instancia no se analiza porque es un simple programa de comunicacion para comprobar que la comunicacion funciona...<br><br></div><div>Ahora bien ese mismo metodo lo repeti en la pantalla que debe analizar la trama y cambia a esto otro<br><br>procedure TfrmPesaje.olePuertoRxData(Sender: TObject);<br>var<br> lcLecturaReal,lcLecturaHex,lcLecturaTotal,lcLetra:string;<br> i:integer;<br>begin<br> lcLecturaHex:='';<br> lcLecturaTotal:='';<br> lcLecturaReal:= olePuerto.ReadData;<br> for i := 1 to Length(lcLecturaReal) do<br> begin<br> lcLetra:=InttoHex(Ord(lcLecturaReal[i]),2);<br> lcLecturaHex := lcLecturaHex + lcLetra+ ' ';<br> case lcLetra of<br> '30'..'39':<br> begin<br> lcLetra:=RightStr(lcLetra,1);<br> lcLecturaTotal := lcLecturaTotal + lcLetra;<br> end;<br> '0D':<br> begin<br> lcLecturaTotal := lcLecturaTotal + 'CR';<br> if (cboBalanza.KeyValue=1) then<br> begin<br> lcLecturaTotal := lcLecturaTotal +'LF';<br> if llAuditaCom=True then<br> UpdLog(lcLecturaTotal);<br> UpdPeso(lcLecturaTotal);<br> lcLecturaTotal:='';<br> end;<br> end;<br> '0A':<br> begin<br> lcLecturaTotal := lcLecturaTotal +'LF';<br> if llAuditaCom=True then<br> UpdLog(lcLecturaTotal);<br> UpdPeso(lcLecturaTotal);<br> lcLecturaTotal:='';<br> end;<br> else<br> begin<br> if (lcLetra='02') and (Length(lcLecturaTotal)>0) then<br> begin<br> if llAuditaCom=True then<br> UpdLog(lcLecturaTotal);<br> UpdPeso(lcLecturaTotal);<br> lcLecturaTotal:='';<br> end;<br> if (lcLetra='02') then<br> lcLetra:='STX'<br> else<br> lcLetra:='|'+lcLetra+'|';<br> lcLecturaTotal := lcLecturaTotal + lcLetra;<br> end;<br> end;<br> end;<br> if llAuditaCom=True then<br> UpdLog(lcLecturaHex);<br>end;<br><br></div><div>Si revisan el cambio es minimo ya que en vez de agregar la lectura al ListBox o al Memo, envio la lectura como argumento al UpdPeso<br><br></div><div>Y UpdPeso funciona sin inconveniente, cuyo codigo es el siguiente:<div><div><br><br>procedure TfrmPesaje.UpdPeso(cLectura:String);<br>var<br> lcTramas:TStringList;<br> lnIndice,lnNeto,lnNegativo,lnFueraRango,lnFueraEqui,lnTeclaAd,lnCantTramas:integer;<br> lcEstadoA,lcEstadoB,lcEstadoC,lcPeso,lcTara,lcDecimales,lcLectura:string;<br>begin<br> lcEstadoA:='';<br> lcEstadoB:='';<br> lcEstadoC:='';<br> lcPeso:='';<br> lcTara:='';<br> lcTramas:= TStringList.Create;<br> Split('|', cLectura, lcTramas);<br> lnCantTramas:=lcTramas.count;<br> if lnCantTramas=5 then<br> begin<br> lcEstadoA:=lcTramas.Strings[1];<br> lcEstadoB:=lcTramas.Strings[2];<br> lcEstadoC:=lcTramas.Strings[3];<br> lcPeso:=copy(lcTramas.Strings[4],1,6);<br> lcTara:=copy(lcTramas.Strings[4],7,6);<br> {Analisis Estado A}<br> lcEstadoA:=HextoBin(lcEstadoA);<br> lcDecimales:=copy(lcEstadoA,6,3);<br> case lcDecimales of<br> '010':lnPesoComa:=0;<br> '011':lnPesoComa:=1;<br> '100':lnPesoComa:=2;<br> '101':lnPesoComa:=3;<br> '110':lnPesoComa:=4;<br> else<br> lnPesoComa:=0;<br> end;<br> {Analisis Estado B}<br> lcEstadoB:=HextoBin(lcEstadoB);<br> lnNeto:=StrToInt(copy(lcEstadoB,8,1));<br> lnNegativo:=StrToInt(copy(lcEstadoB,7,1));<br> lnFueraRango:=StrToInt(copy(lcEstadoB,6,1));<br> lnFueraEqui:=StrToInt(copy(lcEstadoB,5,1));<br> {Analisis Estado C}<br> lcEstadoC:=HextoBin(lcEstadoC);<br> lnTeclaAd:=StrToInt(copy(lcEstadoB,5,1));<br> {Calculos Finales}<br> lnPesoTara:=StrToInt(lcTara)/(Exp(LN(10)*lnPesoComa));<br> lnPesoTot:=StrToInt(lcPeso)/(Exp(LN(10)*lnPesoComa));<br> if lnNegativo=1 then<br> lnPesoTot:=lnPesoTot*(-1);<br></div></div> end;<br>end;<br><br></div><div>El valor que quiero mostrar se almacena en la propiedad del formulario lnPesoTot,<br><br></div><div>Entiendo que con este link <a href="http://wiki.freepascal.org/Multithreaded_Application_Tutorial/es" target="_blank">http://wiki.freepascal.org/Multithreaded_Application_Tutorial/es</a><br></div><div>debería implementar un hilo con el procedimiento UpdPeso, o quizas un hilo que sea llamado desde el procedimiento UpdPeso.<br><br></div><div>Hasta ahora por mas que lo estudio no logro entender como se hace eso, porque entiendo que mi caso es este...<br><br><pre dir="ltr"><pre><span>Type</span>
TForm1 <span>=</span> <span>class</span><span>(</span>TForm<span>)</span>
Button1<span>:</span> TButton<span>;</span>
Label1<span>:</span> TLabel<span>;</span>
<span>procedure</span> FormCreate<span>(</span>Sender<span>:</span> <span>TObject</span><span>)</span><span>;</span>
<span>procedure</span> FormDestroy<span>(</span>Sender<span>:</span> <span>TObject</span><span>)</span><span>;</span>
<span>private</span>
<span>{ private declarations }</span>
MyThread<span>:</span> TMyThread<span>;</span>
<span>procedure</span> ShowStatus<span>(</span>Status<span>:</span> <span>string</span><span>)</span><span>;</span>
<span>public</span>
<span>{ public declarations }</span>
<span>end</span><span>;</span>
<span>procedure</span> TForm1<span>.</span><span>FormCreate</span><span>(</span>Sender<span>:</span> <span>TObject</span><span>)</span><span>;</span>
<span>begin</span>
<span>inherited</span><span>;</span>
MyThread <span>:</span><span>=</span> TMyThread<span>.</span><span>Create</span><span>(</span><span>true</span><span>)</span><span>;</span>
MyThread<span>.</span><span>OnShowStatus</span> <span>:</span><span>=</span> <span>@</span>ShowStatus<span>;</span>
<span>end</span><span>;</span>
<span>procedure</span> TForm1<span>.</span><span>FormDestroy</span><span>(</span>Sender<span>:</span> <span>TObject</span><span>)</span><span>;</span>
<span>begin</span>
MyThread<span>.</span><span>Terminate</span><span>;</span>
MyThread<span>.</span><span>Free</span><span>;</span>
<span>inherited</span><span>;</span>
<span>end</span><span>;</span>
<span>procedure</span> TForm1<span>.</span><span>Button1Click</span><span>(</span>Sender<span>:</span> <span>TObject</span><span>)</span><span>;</span>
<span>begin</span>
MyThread<span>.</span><span>Resume</span><span>;</span>
<span>end</span><span>;</span>
<span>procedure</span> TForm1<span>.</span><span>ShowStatus</span><span>(</span>Status<span>:</span> <span>string</span><span>)</span><span>;</span>
<span>begin</span>
Label1<span>.</span><span>Caption</span> <span>:</span><span>=</span> Status<span>;</span>
<span>end</span><span>;<br><span style="font-family:arial,helvetica,sans-serif"><br></span></span></pre><pre><span><span style="font-family:arial,helvetica,sans-serif">Pero no se si Deberia reemplazar ShowStatus por UpdPeso y MyThread.Resume colocarlo en el lugar en que coloco UpdPeso...<br><br></span></span></pre><pre><span><span style="font-family:arial,helvetica,sans-serif">Voy a probar asi, ya que ningun otro consejo me dio resultado.<br><br></span></span></pre><pre><span><span style="font-family:arial,helvetica,sans-serif">Saludos y los mantengo al tanto.<br><br></span></span></pre><pre><span><span style="font-family:arial,helvetica,sans-serif">Pancho<br></span></span></pre><pre><span><span style="font-family:arial,helvetica,sans-serif">Córdoba<br></span></span></pre><pre><span><span style="font-family:arial,helvetica,sans-serif">Argentina<br></span></span></pre></pre><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">El 5 de agosto de 2015, 13:04, Daniel Sánchez <span dir="ltr"><<a href="mailto:resetsoftware@gmail.com" target="_blank">resetsoftware@gmail.com</a>></span> escribió:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Lo que comentas es al parecer que cuando pierde el foco el formulario en tu caso llamando a showmessage y vuelve es cuando se muestra el dato, en todo caso haz un deactivate/activate en tu formulario para que dispare el evento refresh del mismo o en todo caso invoca el refresh del formulario. Otra cosa después de actualizar tu text y te posicionas en el con el mouse o el teclado sigue sin mostrar tus datos nuevos o sigue mostrando los datos anteriores.<div><br></div><div>Saludos</div></div><div class="gmail_extra"><br><div class="gmail_quote"><div><div><div><div>El 4 de agosto de 2015, 11:30, francisco prieto <span dir="ltr"><<a href="mailto:fajprieto@gmail.com" target="_blank">fajprieto@gmail.com</a>></span> escribió:<br></div></div></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div><div><div><div dir="ltr"><div><div><div><div><div><div><div><div><div><div>Tengo el siguiente código<br><br>procedure TfrmPesaje.UpdPeso(cLectura:String);<br>var<br> lcTramas:TStringList;<br> lnIndice,lnNeto,lnNegativo,lnFueraRango,lnFueraEqui,lnTeclaAd,lnCantTramas:integer;<br> lcEstadoA,lcEstadoB,lcEstadoC,lcPeso,lcTara,lcDecimales,lcLectura:string;<br>begin<br> lcEstadoA:='';<br> lcEstadoB:='';<br> lcEstadoC:='';<br> lcPeso:='';<br> lcTara:='';<br> lcTramas:= TStringList.Create;<br> Split('|', cLectura, lcTramas);<br> lnCantTramas:=lcTramas.count;<br> if lnCantTramas=5 then<br> begin<br> lcEstadoA:=lcTramas.Strings[1];<br> lcEstadoB:=lcTramas.Strings[2];<br> lcEstadoC:=lcTramas.Strings[3];<br> lcPeso:=copy(lcTramas.Strings[4],1,6);<br> lcTara:=copy(lcTramas.Strings[4],7,6);<br> {Analisis Estado A}<br> lcEstadoA:=HextoBin(lcEstadoA);<br> lcDecimales:=copy(lcEstadoA,6,3);<br> case lcDecimales of<br> '010':lnPesoComa:=0;<br> '011':lnPesoComa:=1;<br> '100':lnPesoComa:=2;<br> '101':lnPesoComa:=3;<br> '110':lnPesoComa:=4;<br> else<br> lnPesoComa:=0;<br> end;<br> {Analisis Estado B}<br> lcEstadoB:=HextoBin(lcEstadoB);<br> lnNeto:=StrToInt(copy(lcEstadoB,8,1));<br> lnNegativo:=StrToInt(copy(lcEstadoB,7,1));<br> lnFueraRango:=StrToInt(copy(lcEstadoB,6,1));<br> lnFueraEqui:=StrToInt(copy(lcEstadoB,5,1));<br> {Analisis Estado C}<br> lcEstadoC:=HextoBin(lcEstadoC);<br> lnTeclaAd:=StrToInt(copy(lcEstadoB,5,1));<br> {Calculos Finales}<br> lnPesoTara:=StrToInt(lcTara)/(Exp(LN(10)*lnPesoComa));<br> lnPesoTot:=StrToInt(lcPeso)/(Exp(LN(10)*lnPesoComa));<br> if lnNegativo=1 then<br> lnPesoTot:=lnPesoTot*(-1);<br> {Actualizo campo de Peso Actual}<br> txtPesoAct.Text:=FloatToStr(lnPesoTot);<br> txtPesoAct.Refresh;<br> application.ProcessMessages;<br> end; <br><br></div>Que se ejecuta por cada lectura del puerto serie.<br><br></div>txtPesoAct es una caja de texto en la cual pongo el peso de la balanza.<br><br></div>Si solo hago el Refresh no se refresca el control...<br></div>Si le agrego application.ProcessMessages tampoco se refresca el control.<br><br></div>El control solo se refresca cuando hago un showmessage desde otro control.<br><br></div>Tengo otra pantalla que tiene un codigo similar pero el que recibe la info es una lista, en ese caso funciona sin inconvenientes...<br><br></div>Espero sus comentarios.<br><br></div>Pancho<br></div>Córdoba<br></div>Argentina<span><font color="#888888"><br></font></span></div></div></div></div></div><span><font color="#888888">
<p></p>
-- <br><span>
Has recibido este mensaje porque estás suscrito al grupo "comunidad-hispana-freepascal" de Grupos de Google.<br>
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a <a href="mailto:freepascalhispano+unsubscribe@googlegroups.com" target="_blank">freepascalhispano+unsubscribe@googlegroups.com</a>.<br></span>
Para ver esta conversación en el sitio web, visita <a href="https://groups.google.com/d/msgid/freepascalhispano/CAB6XyW1o82vA9sBAtO0LW48Q6qk84jBD9PJFrWXyNJk_datp1w%40mail.gmail.com?utm_medium=email&utm_source=footer" target="_blank">https://groups.google.com/d/msgid/freepascalhispano/CAB6XyW1o82vA9sBAtO0LW48Q6qk84jBD9PJFrWXyNJk_datp1w%40mail.gmail.com</a>.<span><br>
Para acceder a más opciones, visita <a href="https://groups.google.com/d/optout" target="_blank">https://groups.google.com/d/optout</a>.<br>
</span></font></span></blockquote></div><br><br clear="all"><span><font color="#888888"><div><br></div>-- <br><div><div dir="ltr"><div><div dir="ltr">Daniel Sánchez Escobar<br>Investigación y Desarrollo<br>Reset Software & Sistemas<br>Móvil +051-949398047 RPM #948615385<br>Trujillo - Perú<div><br></div><div><span style="text-align:center;font-size:20pt;line-height:30.6666641235352px;font-family:Webdings;color:rgb(0,127,0)" lang="ES">P</span><span style="text-align:center;font-size:11pt;line-height:16.8666667938232px;font-family:Calibri,sans-serif;color:rgb(0,127,0)" lang="ES"> </span><span style="text-align:center"></span><span style="text-align:center;font-size:8pt;line-height:12.2666673660278px;font-family:Calibri,sans-serif;color:rgb(0,127,0)" lang="ES">Sugerimos no imprimir este e-mail a menos que sea absolutamente necesario. Protejamos el medio ambiente.</span><br></div></div></div></div></div>
</font></span></div><span><font color="#888888"><span>
<p></p>
-- <br>
Has recibido este mensaje porque estás suscrito al grupo "comunidad-hispana-freepascal" de Grupos de Google.<br>
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a <a href="mailto:freepascalhispano+unsubscribe@googlegroups.com" target="_blank">freepascalhispano+unsubscribe@googlegroups.com</a>.<br></span>
Para ver esta conversación en el sitio web, visita <a href="https://groups.google.com/d/msgid/freepascalhispano/CA%2BEDH_V%3DY2gOs66FZKPtHzCW6rhuyW-29z2rkosiMR5eB0r3-Q%40mail.gmail.com?utm_medium=email&utm_source=footer" target="_blank">https://groups.google.com/d/msgid/freepascalhispano/CA%2BEDH_V%3DY2gOs66FZKPtHzCW6rhuyW-29z2rkosiMR5eB0r3-Q%40mail.gmail.com</a>.<div><div><br>
Para acceder a más opciones, visita <a href="https://groups.google.com/d/optout" target="_blank">https://groups.google.com/d/optout</a>.<br>
</div></div></font></span></blockquote></div><br></div>
<br></div></div><span class="">_______________________________________________<br>
Lazarus-es mailing list<br>
<a href="mailto:Lazarus-es@lists.lazarus.freepascal.org" target="_blank">Lazarus-es@lists.lazarus.freepascal.org</a><br>
<a href="http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es" rel="noreferrer" target="_blank">http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es</a><br>
<br></span></blockquote></div><br><br clear="all"><div><br></div>-- <br><div><div dir="ltr"><span style="font-size:small;font-family:tahoma,sans-serif"><div style="display:inline"></div></span><span class=""><font face="tahoma, sans-serif" style="font-size:small">Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.<div style="display:inline"> </div></font><i style="font-size:small;font-family:tahoma,sans-serif">Linus Torvalds</i><br></span></div></div>
</div>
<br>_______________________________________________<br>
Lazarus-es mailing list<br>
<a href="mailto:Lazarus-es@lists.lazarus.freepascal.org">Lazarus-es@lists.lazarus.freepascal.org</a><br>
<a href="http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es" rel="noreferrer" target="_blank">http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">El que pregunta aprende, y el que contesta aprende a responder.<br><br>No a la obsolecencia programada: <a href="http://www.rtve.es/noticias/20110104/productos-consumo-duran-cada-vez-menos/392498.shtml" target="_blank">http://www.rtve.es/noticias/20110104/productos-consumo-duran-cada-vez-menos/392498.shtml</a><br><br>Linux User #495070<br><a href="http://domonetic.com/blog" target="_blank">http://domonetic.com/blog</a></div>
</div>