Club Delphi  
    FTP   CCD     Enlaces   Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Desplegado
  #1  
Antiguo 22-04-2009
Avatar de Carmelo Cash
Carmelo Cash Carmelo Cash is offline
Miembro
 
Registrado: jul 2003
Ubicación: Buenos Aires
Posts: 197
Carmelo Cash Va por buen camino
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;
    ModeCB;
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
Responder Con Cita
  #2  
Antiguo 22-04-2009
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.270
duilioisola Va por buen camino
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]);
...
Responder Con Cita
  #3  
Antiguo 22-04-2009
Avatar de Carmelo Cash
Carmelo Cash Carmelo Cash is offline
Miembro
 
Registrado: jul 2003
Ubicación: Buenos Aires
Posts: 197
Carmelo Cash Va por buen camino
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?
Responder Con Cita
  #4  
Antiguo 22-04-2009
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.270
duilioisola Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 22-04-2009
Avatar de Carmelo Cash
Carmelo Cash Carmelo Cash is offline
Miembro
 
Registrado: jul 2003
Ubicación: Buenos Aires
Posts: 197
Carmelo Cash Va por buen camino
Cool

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.
Gracias nuevamente.
Responder Con Cita
  #6  
Antiguo 22-04-2009
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Moderador
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.645
rgstuamigo Va por buen camino
Lightbulb

Cita:
Empezado por Carmelo Cash Ver Mensaje
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....
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #7  
Antiguo 22-01-2010
jucabb jucabb is offline
Miembro
 
Registrado: ene 2010
Posts: 10
jucabb Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 23-01-2010
Avatar de rretamar
[rretamar] rretamar is offline
Miembro Premium
 
Registrado: ago 2006
Ubicación: San Francisco, Córdoba, Argentina
Posts: 1.031
rretamar Va camino a la fama
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 !
__________________
Lazarus Codetyphon : Desarrollo de aplicaciones Object Pascal, libre y multiplataforma.
Responder Con Cita
  #9  
Antiguo 25-01-2010
jucabb jucabb is offline
Miembro
 
Registrado: ene 2010
Posts: 10
jucabb Va por buen camino
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.
Responder Con Cita
  #10  
Antiguo 26-01-2010
Avatar de ppb
[ppb] ppb is offline
Miembro Premium
 
Registrado: jun 2005
Ubicación: España
Posts: 92
ppb Va por buen camino
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.
__________________
Because , I have a power.
Responder Con Cita
  #11  
Antiguo 26-01-2010
jucabb jucabb is offline
Miembro
 
Registrado: ene 2010
Posts: 10
jucabb Va por buen camino
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
Responder Con Cita
  #12  
Antiguo 28-01-2010
Avatar de ppb
[ppb] ppb is offline
Miembro Premium
 
Registrado: jun 2005
Ubicación: España
Posts: 92
ppb Va por buen camino
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.
__________________
Because , I have a power.
Responder Con Cita
  #13  
Antiguo 30-01-2010
jucabb jucabb is offline
Miembro
 
Registrado: ene 2010
Posts: 10
jucabb Va por buen camino
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.
Responder Con Cita
Respuesta


Herramientas
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
protocolo de comunicacion via puerto serie martin_vcp Varios 1 01-08-2008 15:23:02
AYUDA,Comunicación con el puerto Serie tanketa OOP 2 18-04-2007 00:13:08
comunicacion con el puerto serie de la PC en C++ Builder 5 RobeCarl C++ Builder 2 10-01-2007 00:36:06
Comunicacion Serie jorge_mosquera Varios 1 24-11-2005 16:40:47
usar XON/XOFF en comunicacion puerto serie apgperi C++ Builder 0 08-06-2005 12:33:55


La franja horaria es GMT +2. Ahora son las 18:38:11.


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