Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Comunicacion con puerto serie (https://www.clubdelphi.com/foros/showthread.php?t=64834)

Carmelo Cash 22-04-2009 08:04:59

Comunicacion con puerto serie
 
Hola foro:

Estoy haciendo un programa que debe enviar y recibir datos por el puerto rs232. Tengo 0 (cero) experiencia en el tema y quería consultar dos cosas.

La primera es: En la sección "Trucos" existe un hilo
http://www.clubdelphi.com/trucos/ind...ll=0&scrollb=0

Donde hay un ejemplo para leer y escribir por el puerto serie. La pregunta es:

1.- ¿Conviene usar este tipo de código o instalar algún componente para este tipo de comunicación?

2.- Si conviene utilizar un componente ¿Cual sería el más recomendable?.

3.- Si conviene usar este código debo adaptar la parte de escritura, ya que en ejemplo transmite un solo byte,

Código Delphi [-]
Num:=253; // Dato a enviar
repeat until FileWrite(Puerto,Num,1)=1;
Sleep(1000); // Espera para enviar el siguiente dato

, Entonces hago algo como:


Código Delphi [-]
function TForm1.Transmitir(Mensaje:String): boolean;
var Puerto, I :integer;
    Num:byte;
    Dato:String;
    Mode:DCB;
begin
  result:=false;
  try
    Puerto:=FileOpen('COM1:',fmOpenReadWrite);
    Mode.BaudRate := 9600;
    Mode.ByteSize := 8;
    Mode.Parity := NOPARITY;
    Mode.StopBits := ONESTOPBIT;
    SetCommState(Puerto, Mode); //Ajusta los parámetros
    for i:=0 to length(Mensaje)do begin
      Dato:=Copy(Mensaje,i,1);
      num:= ????(Dato)                 ;   //<<< Incompatible Byte y String
      repeat until FileWrite(Puerto,Num,1)=1;
      Sleep(1000);
      if i=length(Mensaje) then begin
          result:=true;
      end;
    end;
  except
    //
  end;
end;

pero en num:= ????(Dato) debe ir alguna forma de convertir la caaadena en un Byte.

Eso es todo. Gracias por su atención

duilioisola 22-04-2009 15:20:04

Código Delphi [-]
function TForm1.Transmitir(Mensaje:String): boolean;
var Puerto, I :integer;
    Num:byte;
    {no es necesario
    Dato:String;}
    ModeCB;
begin
...
    for i:=0 to length(Mensaje)do begin
      {no es necesario
      Dato:=Copy(Mensaje,i,1);}
      num:= Ord(Mensaje[i]);
...

Carmelo Cash 22-04-2009 16:07:24

Gracias
 
Gracias duiliolosa con
Código Delphi [-]
    for i:=1 to length(Mensaje) do begin
      num:= Ord(Mensaje[i]);
      ....   
    end;
quedó bien ya que te transforma el string a byte, ver que i empiece de 1 y no de cero.

Queda el otro tema:
¿Que es mejor, usar esto o un componente? :confused:

duilioisola 22-04-2009 16:36:37

Es verdad ... me comí el comienzo del string...

Si esto te es suficiente, no necesitas un componente. ¿Qé es lo que vas a hacer?

Un componente puede que te dé alguna funcionalidad extra para controlar errores o enviar directamente un string.

Carmelo Cash 22-04-2009 21:18:37

Hola: gracias por responder.
Sólo necesito enviar un texto y esperar la respuesta. Yo creo que con esto me alcanza. El modo de lectura / escritura lo saqué de "Trucos", lo único que hice fué convertirlo en una función que te devuelve true o false. Es que si la cosa es así de facil para que están esos componentes de que hablan. Voy a probar así y ver que sale. :cool:
Gracias nuevamente.

rgstuamigo 22-04-2009 23:11:57

Cita:

Empezado por Carmelo Cash (Mensaje 345786)
Gracias duiliolosa con
Código Delphi [-] for i:=1 to length(Mensaje) do begin num:= Ord(Mensaje[i]); .... end;

quedó bien ya que te transforma el string a byte, .....

Lo correcto es que no es que tranforma un string a byte, sino un Caracter (char)a byte.;) Ten en cuenta eso.No es lo mismo decir un string que un caracter(ascii).Delphi lo diferencia por sus tipos de datos String y char.
Bueno agregando un poquito esta linea de codigo que te propone duilioisola:
Código Delphi [-]
...
num:= Ord(Mensaje[i]);
...
tambien se podria hacer casting algo asi:
Código Delphi [-]
num:=Byte(Mensaje[i]);//aqui estoy transformando un char a byte(casting).
Para complementar tus dudas sobre conversion char a byte y viseversa chequea este hilo.
Saludos...:).

jucabb 22-01-2010 22:54:41

Buenas tardes:
Disculpen cuando uso ese programa una vez funciona bien, pero si intento ejecutarlo nuevamente no funciona, no se si el puerto serial se queda bloqueado?. Debo desconectar el otro equipo para que pueda funcionar nuevamente el programa. Agregue FileClose(Puerto), pero tampoco me funciona esto.

agradecere mucho me puedan dar una mano con esto.
Muchas gracias,
Juan C.

rretamar 23-01-2010 14:53:36

Mis dos centavos al asunto:

No pierdas el tiempo accediendo al puerto "a pelo". Descarga e instala la suite AsyncPro (es software libre) y podrás hacer todo eso sin dificultad, incluso tiene componentes para decodificación de paquetes (lo que veo que estás haciendo "a mano") y máquina de estados para implementar protocolos complejos. Todo acompañado de una excelente documentación.

Si tenés alguna duda sobre estos componentes o necesitas ejemplos de uso, con gusto intentaré darte una mano.

Saludos !

jucabb 25-01-2010 20:06:08

Hola Planteo nuevamente mi problema:

Usando el programa de truco que se encuentra mas arriba, logro adquirir correctamente una primera lectura de un dispositivo por RS232.
Puedo apreciar que cada vez que deseo leer, previamente debo escribir o enviar CR (return) al dispositivo, el cual me responde con una cadena que termina en CR LF.
Mi problema se presenta al realizar un bucle y querer leer por segunda vez el puerto. El programa queda como bloqueado pensando.
Por favor, si alguien me pudiera orientar respecto a que podria hacer.
No se si debo de alguna forma limpiar el puerto despues de cada lectura?, si fuera asi cual seria el comando a utilisar?.
Agradesco la respuesta anteriormente recibida, pero justamente mi trabajo requiere que realice este programa sin utilisar otros componentes como el Aync Pro.
Por favor, agradeceria me orientaran a la solucion de este problema.
Gracias,
jc.

ppb 26-01-2010 14:38:09

Pude ser que tengas activado el handshake/"control de flujo" por hardware
( DTR, RTS , CTS ) por la pista que das , intenta quitar el modo y ponerlo a none/ninguno , aunque no se si podrás hacerlo con el modo de acceso al
cana serie que estas intentando; también prodrías utilizar el "HyperTerminal".

¿ Por que no pueden utlizar un componente ? un trabajo de la escuela / facultad ?

Un saludo.

jucabb 26-01-2010 19:54:05

Hola gracias por tu respuesta.
Es para un trabajo en la escuela. Estoy obligado a desarrollarlo asi.
Por otro lado, el control de flujo esta en None en el puerto utilizado.
Con el hyper terminal puedo leer los datos sin problema. Pero con mi programa abro el puero y leo una primera vez, luego cierro el programa y cuando lo ejecuto nuevamente al momento de intentar leer se queda colgado pensando.

Dime si deseas que te envie mi programa, o si tenes alguna otra sugerencia.
gracias,
jc

ppb 28-01-2010 11:03:50

Yo siempre utilizo el API de Windows para el acceso al canal serie , aquí
te dejo el link al MSDN, quizás puedas utilizar alguna función que te
solucione el problema.

http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx


Un saludo.

jucabb 30-01-2010 04:19:41

Gracias por su respuesta. Al final me permitieron hacerlo con algun componente, asi que utilize Tcomport y ya realize mi programa sin problemas. Nuevamente gracias por el apoyo.
saludos,
jc.


La franja horaria es GMT +2. Ahora son las 03:26:20.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi