PDA

Ver la Versión Completa : ¿Como enviar un mensaje en ASCII desde un edit a una máquina por puerto serial?


The_Animal
14-11-2007, 16:40:29
Estimados amigos de ClubDelphi:

Primero que nada, agradezco por la existencia de esta página, ya que gracias a ustedes pude resolver muchas dudas en relación a la programación en Delphi.

Es la primera vez que programo en este programa (El cual llevo 2 meses informandome y una semana realizando este programa) y mi primer post.

Mi consulta es la siguiente:

Estoy en mi seminario de título y estoy realizando un programa con Delphi 7 para poder realizar comunicación por puerto serial con unos equipos de una molinera (4 en total), por código ASCII.

El asunto es que por medio de un edit, quiero realizar un cambio de valor de por ejemplo, de 6300 Kg/m3 de un dosificador de trigo a 6000. y el comando es el siguiente:

>01Q006300D8 (Este es un ejemplo). (Si tengo entendido, por código ASCII).

El asunto es que este comando es recepcionado por la máquina, recibiendo una respuesta en el computador, del tipo ACK (Mensaje correcto), y NAK (Mensaje fallido o No hay Respuesta). Esto lo logré por medio del uso de Hyperterminal.

Pero lo que quiero es realizar la misma acción con el programa en Delphi, en la cual envío el valor por medio de un edit, recibir la respuesta de la máquina a un memo, y a la vez de realizar el cambio del valor de 6300 a 6000 en ese dosificador. Quisiera que pudieran aportarme con un ejemplo o programa, y si también me pueden recomendar el componente para el puerto serial (Tengo el TComport, el Turbo Power Async, ý otros componentes más).

También que me responda, con su comando respectivo, pero a una balanza electrónica.

Espero que no sea mucho pedir, y disculpen si a alguno de repente le pueda molestar el mensaje, es mi primer post.

jhonny
15-11-2007, 00:35:21
Bueno, te cuento que tu post no es desagradable, todo lo contrario para ser tu primer post es bueno :).

No soy un experto en la materia por lo que solo puedo decirte dos cosas al respecto...

1. Se supone que la cadena que nos haz mostrado "01Q006300D8" es una "trama" donde tu debes saber el significado de cada caracter que en dicha cadena. Para enviar estas "señales" a dicho puerto deberas hacerlo de alguna manera y seguramente la función CHR de Delphi te ayudara con eso ya que tiene que ser ASCII ;).

2. Te recomiendo que el Memo donde recibes el resultado que te devuelve el aparato que mencionas tenga como Font.Name la fuente Terminal, para que veas la diferencia entre los caracteres y no te encuentres con un poco de cuadritos iguales que a los ojos humanos no signifiquen nada ;).

Se que esto no te ayudara en gran manera pero aún asi, espero que por lo menos te sirva de algo.

Hasta la proxima :).

FGarcia
15-11-2007, 01:05:26
Hola!

A groso modo tu no debes de convertir nada a ascii pues de eso se encarga el componente que uses (yo uso ComPort de Djan Cernilla). Por ejemplo:


//Enviamos una cadena con un click de un boton
procedure TForm1.Button_SendClick(Sender: TObject);
var
Str: String;
begin
Str := Edit_Data.Text;
Str := Str + #13#10;
ComPort.WriteStr(Str);
end;

Asi mismo deberias tener una "escucha" que espere la respuesta por ejemplo:


//Esperamos un mensaje de respuesta
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
Str: String;
begin
ComPort.ReadStr(Str, Count);
Memo.Text := Memo.Text + Str;
end;

Con respecto a lo de la balanza, que tipo / marca de balanza o bascula es? cada marca tiene formatos de transmision diferentes.

Espero te ayude esto y si quedan mas dudas comentalas que alguien nos respondera.

egostar
15-11-2007, 01:06:48
Hola The_Animal

Yo uso el componente TApro y es muy simple hacer lo que deseas.


ApdComPort2.PutString('>01Q006300D8');


Para recibir el caracter de control puedes usar un trigger del mismo componente mas o menos así:


DataTrig1 := ApdComPort2.AddDataTrigger(#6, True); //ACK
DataTrig2 := ApdComPort2.AddDataTrigger(#21, True); //NAK


Y posteriormente actuar en consecuencia en el evento OnTriggerAvail del mismo componente.

Salud OS

jhonny
15-11-2007, 15:22:48
Bueno, solo una anotación mas:

Comport
=======

Delphi/C++ Builder serial communications library. This is less known and has fewer features compared with AsyncPro. (http://sourceforge.net/projects/tpapro/) However, it is generally easier to use for straightforward I/O.

Como ultimamente ando peor que antes con esto del ingles, pues use la ayuda de un amigo que hay en la red (Al tipo ese le dicen disque google :D), el cual me ha dicho que eso significa lo siguiente:

Delphi / C + + Builder biblioteca de comunicaciones serie. Esto es menos conocida y tiene menos funciones en comparación con AsyncPro. (Http://sourceforge.net/projects/tpapro/) Sin embargo, es generalmente más fácil de usar para el sencillo I / O.

TPapro
======

Async Professional is a comprehensive communications toolkit for Borland Delphi, C++Builder, & ActiveX environments. It provides direct access to serial ports, TAPI, and the Microsoft Speech API. It supports faxing, terminal emulation, VOIP, & more.

Async Professional es un completo kit de herramientas de comunicaciones para Borland Delphi, C + + Builder, ActiveX y entornos. Ofrece acceso directo a los puertos serie, TAPI, y el Microsoft Speech API. Apoya fax, emulación de terminal, VOIP, y más.


Lo bueno de TPapro es que es mas completo, lo bueno de Comport es que segun ellos es mas sencillo de usar y que hay un proyecto de Comport para Lazarus http://sourceforge.net/projects/cportlaz/ :). Parece que hay suficientes opciones :).

The_Animal
15-11-2007, 17:31:05
Estimados amigos de ClubDelphi:

Agradezco que me hayan podido contestar, me estoy empezado a generar una idea, y estoy empezando a trabajarla. Para [FGarcia], Me peguntaste sobre el tipo de balanza que estoy ocupando. La balanza electrónica que estoy usando es la balanza automática MSDL del tipo Tubex de la empresa Suiza Buhler (Al igual que el dosificador de trigo).

No mencioné la trama de la balanza en el mensaje, por que no me acordaba, pero el mensaje que mandé por hyperterminal es el siguiente:

>01qD2 (01 es el número del equipo, q es una variable respectiva de la balanza (No recuerdo con exactitud, creo que peso total no borrable en Kg) y D2 (Hexadecimal), si no me equivoco, corresponde a 132 en decimal).

Espero que puedan seguir ayudándome, y una vez más, gracias a todos por sus aportes.