Club Delphi  
    FTP   CCD     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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema 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: 257
Poder: 21
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.732
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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: 257
Poder: 21
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.732
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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: 257
Poder: 21
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
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
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
Poder: 0
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.168
Poder: 20
rretamar Va camino a la famarretamar 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
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
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 01:17:42.


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
Copyright 1996-2007 Club Delphi