Club Delphi  
    Paypal   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

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-08-2006
Geta Geta is offline
Miembro
 
Registrado: ago 2004
Posts: 27
Poder: 0
Geta Va por buen camino
Cita:
Empezado por seoane
Suponiendo que ya tienes el puerto abierto y configurado, para escribir una cadena puedes usar algo como esto:

Código Delphi [-]var s: string; Escritos: Cardinal; begin s:= 'hola'; // O puede que s:= 'hola' + #13#10; WriteFile(hPort, PChar(s)^,Length(s), Escritos, nil); end;

Magnifico, asi si que me lo entiende el dispositivo. Le he dicho a si a groso modo que encienda un led con un byte en hexadecimal y se ha encendido. pero se supone me tenia que responder un byte y no lo hace. Leo con ReadFile asi:

Código:
comando: String;
...
...
ReadFile(hPort,comando,length(comando),cuantos,nil);
pero nada.
Responder Con Cita
  #2  
Antiguo 18-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
Bien, parece que estas controlando algún tipo de dispositivo electrónico, habría que ver como es el protocolo de comunicación de ese dispositivo. ¿Utiliza comandos de texto?, es decir, los que tu mandas y recibes son cadenas de texto. Si es así, para mandar el texto ya tienes la solución arriba, y para recibir texto hay que saber que carácter termina cada linea. Lo normal es leer byte a byte el puerto serie hasta encontrar el carácter final que suele ser #13.

De todas formas el código que tu pones no es correcto:
Cita:
Empezado por Geta
comando: String;
...
...
ReadFile(hPort,comando,length(comando),cuantos,nil);
No puedes leer el puerto serie con una variable tipo string, al menos no así. Ya que ReadFile intentara leer tantos caracteres como longitud tenga la cadena de texto almacenada en comando (si no hay nada sera 0), y lo peor es que lo almacenara a partir de la primera posición de memoria de la variable comando, que en un string no coincide con el primer carácter de la misma. Yo normalmente leo los bytes uno a uno, o utilizo un buffer (un array de Chars).

De todos modos, ¿cual es el protocolo de comunicación de ese dispositivo?, ¿que le tienes que mandar tu?, ¿que te responde el?, ¿es texto o bytes?, ¿sabes la longitud de la respuesta, o esta delimitada por un carácter final?. Y si no es mucho preguntar ¿que dispositivo es?, si me das más datos puede que entienda mejor lo que necesitas.
Responder Con Cita
  #3  
Antiguo 19-08-2006
Geta Geta is offline
Miembro
 
Registrado: ago 2004
Posts: 27
Poder: 0
Geta Va por buen camino
al dispositivo se le mandan bytes en hexadecimal pero para mandarselos y que lo entienda ese byte lo hemos de pasar a char. Asi por ejemploo mandando la siguiente secuencia de bytes 20 30 40 50 primero tendria que pasar el byte 20 a char luego el 30 a char, etc y cuando tengamos todos los bytes en char mandarlo. la respuesta nos tendria que dar una secuencia de chars que nosotros pasariamos a hex para ver su valor.

Pero vamos que casi todos los circuitos electronicos que se manejan por el com creo que van de forma parecido o igual.

Otra cosa, se me olvidaba darte la gracias por tu interes.
Responder Con Cita
  #4  
Antiguo 19-08-2006
Geta Geta is offline
Miembro
 
Registrado: ago 2004
Posts: 27
Poder: 0
Geta Va por buen camino
Al final lo he conseguido. Muchas gracias. Lo que he hecho a sido hacer lo que tu decias. Con un bucle ir leyendo byte a byte pasarlo a char y añadirlo a un string y ya tengo la respuestas que tenia que darme.

Me has sido de gran ayuda. Muchisimas gracias.

Solo una pregunta que se me ocurre. Al leer un byte del buffer del com con ReadFile, ese byte se borra del buffer al ser leido o se sigue quedando ahi hasta que limpiemos el buffer o se reciba otra cosa?

Última edición por Geta fecha: 19-08-2006 a las 12:55:10.
Responder Con Cita
  #5  
Antiguo 19-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
Parece que mientras respondía, tu te adelantaste

Cita:
Empezado por Geta
Al final lo he conseguido. Muchas gracias. Lo que he hecho a sido hacer lo que tu decias. Con un bucle ir leyendo byte a byte pasarlo a char y añadirlo a un string y ya tengo la respuestas que tenia que darme.

Me has sido de gran ayuda. Muchisimas gracias.

Solo una pregunta que se me ocurre. Al leer un byte del buffer del com con ReadFile, ese byte se borra del buffer al ser leido o se sigue quedando ahi hasta que limpiemos el buffer o se reciba otra cosa?
Al leerlo se borra del buffer, lo limpiar el buffer es una manía que tengo para asegurarme que no hay nada en el buffer antes de empezar.
Responder Con Cita
  #6  
Antiguo 19-08-2006
Geta Geta is offline
Miembro
 
Registrado: ago 2004
Posts: 27
Poder: 0
Geta Va por buen camino
Muchas gracias por todo amigo mio. Ya lo tengo funcionando.
Responder Con Cita
  #7  
Antiguo 19-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
No estoy seguro si te entendí bien, quieres decir que si tienes que mandar el byte 41h (65 en decimal) lo que tienes que mandar es Chr($41) (Una 'A'). No entiendo porque, un Char y un byte tienen ambos el mismo tamaño (8 bits), de hecho no hay diferencia entre enviar un byte o un Char. ¿O refieres acaso a convertir cada byte en dos caracteres que representen su valor hexadecimal?

Por ejemplo, si tengo que enviar los bytes 20h, 30h, 40h, 50h se podría hacer así (siempre suponiendo que tenemos el puerto abierto y configurado):
Código Delphi [-]
var
  Buffer: array[1..4] of byte; // El tamaño puede ser mayor
  Escritos: Cardinal;
begin
  Buffer[1]:= $20;
  Buffer[2]:= $30;
  Buffer[3]:= $40;
  Buffer[4]:= $50;
  WriteFile(hPort, Buffer,4, Escritos, nil);
end;


Para leer los bytes tenemos que saber que nos va a mandar, es decir, podemos estar leyendo continuamente, leer durante un tiempo, o leer hasta encontrar un carácter final. La primera opción no parece practica, solo seria útil para hacer un programa que monitorizara el puerto serie. Y como parece ser que tu dispositivo no utiliza un carácter especial para terminar la conexión, tendremos que quedarnos con la segunda opción.

Código Delphi [-]
var
  Buffer: array[1..4096] of byte; //4kb por ejemplo
  Leidos: Cardinal;
  Ticks: Cardinal;
  i,j: integer;
  B: byte;
  Str: string;
  Estado: TCOMSTAT;
  ErrorCode: cardinal;
begin
  i:= 0;
  Ticks:= GetTickCount;
  repeat
    ClearCommError(hPort, ErrorCode, @Estado);
    if Estado.cbInQue > 0 then
    begin
      ReadFile(hPort,B,1,Leidos,nil);
      inc(i);
      Buffer[i]:= B;
    end else Sleep(10);
  until (GetTickCount - Ticks) > 5000; // Leemos durante 5 segundos
  // Ahora puedes hacer lo que quieras con los bytes recibidos,
  // por ejemplo mostrarlos
  Str:= '';
  for j:= 1 to i do
    Str:= Str + IntToHex(Buffer[j],2) + 'h ';
  ShowMessage(Str);
end;

Una secuencia de como lo haria yo seria la siguiente:

Código:
Abrir el puerto
Configurar el puerto

  Purgar el puerto
  Mandar los bytes
  Recibir la respuesta durante unos segundos
  Mostrar la respuesta o usarla para lo que se quiera

Cerrar el puerto
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
Disminuir el tamaño de un ejecutable tannyk Varios 6 18-05-2005 06:23:41
Disminuir el tamaño de los archivos .pst (outlook) Alexander Windows 3 11-05-2005 19:42:38
Disminuir tamaño de un programa Leomedellin Varios 1 06-04-2005 18:49:05
de BYTE a STRING emeceuy Varios 3 20-08-2004 16:29:32
ADO: Byte nulo (byte #0) en un string Pandre Conexión con bases de datos 0 02-04-2004 20:18:37


La franja horaria es GMT +2. Ahora son las 19:46:47.


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