Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-10-2019
Diego E. Diego E. is offline
Miembro
 
Registrado: mar 2018
Posts: 30
Poder: 0
Diego E. Va por buen camino
Mi función está leyendo mal los parámetros

Hola, nuevamente ando por aquí, sigo avanzando pero cada vez encuentro más y más obstáculos, a ver que tal está éste:

Traigo de una DLL esto y parece que todo va bien:
Código Delphi [-]
@OpenPort := GetProcAddress(hInst, 'OpenSSPComPort2');
      if @OpenPort = nil then
      begin
        FreeLibrary(hInst);
        ShowMessage('No se pudo traer el OpenPort');
      end;

Luego lo mando llamar así:
Código Delphi [-]
if OpenPort(cmd) = 0 then ShowMessage('No se pudo abrir el puerto');

Lo que yo le envio es:
Código Delphi [-]
TSSP_COMMAND = record
  Key: TSSP_FULL_KEY;
  BaudRate: LongInt;
  Timeout: LongInt;
  PortNumber: Byte;
  SSPAddress: Byte;
  RetryLevel: Byte;
  EncryptionStatus: Byte;
  CommandDataLength: Byte;
  CommandData: Array[0..255-1] of Byte;
  ResponseStatus: Byte;
  ResponseDataLength: Byte;
  ResponseData: Array[0..255-1] of Byte;
  IgnoreError: Byte;
end {SSP_COMMAND};

Pcmd = ^TSSP_COMMAND;

var
  command: TSSP_COMMAND;
  cmd: Pcmd;


command.BaudRate := 9600;
    command.Timeout := 1000;
    command.RetryLevel := 3;
    command.IgnoreError := 1;
    command.PortNumber := $14;
    command.SSPAddress := $00;

    cmd := @command;

Total que no no manda error pero me sale el mensaje:
Titulo: COM0
Mensaje: Unable to open this port

Alguna idea de ¿Por qué está tratando de abrir el puerto 0 cuando yo le estoy diciendo que abra el 20($14)? ¿Será que la estoy regando en algún puntero o algo?
Responder Con Cita
  #2  
Antiguo 08-10-2019
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
¿Te falta rellenar parámetros del Command?
Otra opción es probar con enteros en lugar de hexadecimal.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 08-10-2019
Avatar de TOPX
TOPX TOPX is offline
Miembro
 
Registrado: may 2008
Ubicación: Bogotá
Posts: 527
Poder: 16
TOPX Va camino a la fama
Hola,

Por ahí hay una documentación de la estructura que pide esa DLL. Dice así:
Código:
struct SSP_COMMAND
{
SSP_FULL_KEY Key;
unsigned long BaudRate;
unsigned long Timeout;
unsigned char PortNumber;
unsigned char SSPAddress;
unsigned char RetryLevel;
unsigned char EncryptionStatus;
unsigned char CommandDataLength;
unsigned char CommandData[255];
unsigned char ResponseStatus;
unsigned char ResponseDataLength;
unsigned char ResponseData[255];
unsigned char IgnoreError;
};
Pero la está declarando así:
Código Delphi [-]
TSSP_COMMAND = record
  Key: TSSP_FULL_KEY;
  BaudRate: LongInt;
  Timeout: LongInt;
  PortNumber: Byte;
  SSPAddress: Byte;
  RetryLevel: Byte;
  EncryptionStatus: Byte;
  CommandDataLength: Byte;
  CommandData: Array[0..255-1] of Byte;
  ResponseStatus: Byte;
  ResponseDataLength: Byte;
  ResponseData: Array[0..255-1] of Byte;
  IgnoreError: Byte;
end {SSP_COMMAND};

De manera que todos esos tipos de dato están mal, parece que hubiera copiado y pegado de un código Java.

Supongo que debe definir si estará usando Int32 ó Int64, y los arrays deben ser de Char (o usar un alias apropiado dentro de Delphi). Pero ya está en sus manos, usando el SDK y su propio entorno de trabajo.

-
__________________
"constructive mind, destructive thoughts"

Última edición por TOPX fecha: 08-10-2019 a las 15:16:00. Razón: Link a la documentación
Responder Con Cita
  #4  
Antiguo 08-10-2019
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por TOPX Ver Mensaje
Por ahí hay una documentación de la estructura que pide esa DLL. Dice así:

Yo mismo le pasé esa estructura.
Porque en "otro sitio" encontré algo como esto:


Código:
Public Type SSP_COMMAND
  Key As SSP_FULL_KEY
  BaudRate As Long
  Timeout As Long
  PortNumber As Byte
  sspAddress As Byte
  RetryLevel As Byte
  EncryptionStatus As Byte
  CommandDataLength As Byte
  CommandData(254) As Byte  
  ResponseStatus As Byte
  ResponseDataLength As Byte
  ResponseData(254) As Byte
End Type

En el mismo ZIP (que hay en el link) que ha enviado Diego, hay varias versiones de la misma DLL, cada una con cabeceras distintas.

Y sobre ninguna de ellas he encontrado documentación.


Por lo tanto es como dar palos de ciego.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 11-10-2019
Diego E. Diego E. is offline
Miembro
 
Registrado: mar 2018
Posts: 30
Poder: 0
Diego E. Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
¿Te falta rellenar parámetros del Command?
Otra opción es probar con enteros en lugar de hexadecimal.
Hola Neftali, según la documentación y los pasos del programa en C++ que ellos te proveen, sólo deben llenarse los datos que les mostré, ya que las claves y el resto de datos se van a llenar posteriormente. Y sobre el uso de los hexadecimales, primero lo tenía en decimal y como no sirvió lo cambié a hexadecimal por si acaso, pero tampoco funcionó.
Responder Con Cita
  #6  
Antiguo 11-10-2019
Avatar de TOPX
TOPX TOPX is offline
Miembro
 
Registrado: may 2008
Ubicación: Bogotá
Posts: 527
Poder: 16
TOPX Va camino a la fama
Cita:
Empezado por Diego E. Ver Mensaje
primero lo tenía en decimal y como no sirvió lo cambié a hexadecimal por si acaso, pero tampoco funcionó.
Es un Char.
-
__________________
"constructive mind, destructive thoughts"
Responder Con Cita
  #7  
Antiguo 16-10-2019
Javierus Javierus is offline
Miembro
 
Registrado: jun 2017
Posts: 88
Poder: 7
Javierus Va por buen camino
Quizás ya lo hayas resuelto, pero ¿Has probado a usar packed record en vez de record?
Responder Con Cita
  #8  
Antiguo 18-10-2019
Diego E. Diego E. is offline
Miembro
 
Registrado: mar 2018
Posts: 30
Poder: 0
Diego E. Va por buen camino
Cita:
Empezado por Javierus Ver Mensaje
Quizás ya lo hayas resuelto, pero ¿Has probado a usar packed record en vez de record?
¿Para todas las estructuras o sólo para alguna en específico? Se usan de la misma forma?
Responder Con Cita
  #9  
Antiguo 18-10-2019
Diego E. Diego E. is offline
Miembro
 
Registrado: mar 2018
Posts: 30
Poder: 0
Diego E. Va por buen camino
Quizá sea útil ponerlos al día por si alguno sabe el por qué de esta nueva situación.

Resulta que ya se por qué intentaba abrir el puerto cero y algunas cosas más, la respuesta me dejó con muchas más dudas.
La razón por la que se intenta abrir el COM0 es que por alguna razón cuando la funcion lee los datos, los lee de forma revuelta, me explico, la estructura original es la siguiente:

Código Delphi [-]
TSSP_COMMAND = record
  Key: TSSP_FULL_KEY;
  BaudRate: Long;
  Timeout: Long;
  PortNumber: char;
  SSPAddress: char;
  RetryLevel: char;
  EncryptionStatus: char;
  CommandDataLength: char;
  CommandData: Array[0..255-1] of char;
  ResponseStatus: char;
  ResponseDataLength: char;
  ResponseData: Array[0..255-1] of char;
  IgnoreError: char;
end {SSP_COMMAND};

Nota: La cual por cierto si en lugar de char pongo byte o string o cualquier otra, jamás funciona ni el OpenPort, lo mismo con el long.

Lo que me di cuenta es que la función esta por ejemplo tomando el 5° char de la estructura como el puerto, sin importar el nombre del campo, es decir como en esa estrutura el 5° char era CommandDataLength y ese iniciaba en cero por eso intentaba abrir el COM0 y cualquier valor que le pusiera en CommandDataLength lo tomaba como el puerto a abrir, cosa que se me hizo demasiado extraño ya que cualquier campo que ponga en dicho lugar tiene el mismo efecto.

Nunca me había pasado algo así. Saben por qué puede estar pasando eso o si de plano tiene que ver por completo con como hicieron la dll? Por que en el C++ no pasa eso y ciertamente no logro ver que tengo diferente. El puerto abre correctamente cuando pongo el puerto que quiero en dicha posición, pero me pasa lo mismo al enviar un comando y ahí si son tantos campos que no podría identificar cada uno en su lugar y por consiguiente no se ejecuta con éxito.
Responder Con Cita
  #10  
Antiguo 18-10-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Puede ser por la longitud del tipo de dato, no recuerdo de memoria, pero puede que long (por ejemplo) sea distinto en delphi y c++, en uno 16 bits y en otro 32 bits. Es sólo un ejemplo, para que se entienda.
Responder Con Cita
  #11  
Antiguo 18-10-2019
Diego E. Diego E. is offline
Miembro
 
Registrado: mar 2018
Posts: 30
Poder: 0
Diego E. Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Puede ser por la longitud del tipo de dato, no recuerdo de memoria, pero puede que long (por ejemplo) sea distinto en delphi y c++, en uno 16 bits y en otro 32 bits. Es sólo un ejemplo, para que se entienda.
Antes de recurrir al Long usé Byte, que según Embarcadero es el equivalente en Delphi del Unsigned char de C++ y no funcionaba de esa manera, de la que tengo actualmente funciona el Open cuando intento acomodar los campos en un orden específico pero el Send no funciona para nada

http://docwiki.embarcadero.com/RADSt..._types_mapping
Responder Con Cita
  #12  
Antiguo 24-10-2019
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Habría que ver exactamente como es el archivo cabecera en C para ver se aplican alineación al código. Otra forma de saberlo es conocer el tamaño de la estructura en C. Las estructuras pueden estar alineadas en memoria dando como resultado tamaños diferentes a los esperados. Al traducir a delphi estas cosas hay que conocerlas, como saber que para C char tiene siempre tamaño 1 y que es indiferente de BYTE. En delphi unicode CHAR tiene tamaño 2 por lo que la traducción debe ser a AnsiChar o a Byte, según el contexto.

Ya que no dispongo de la dll en cuestión no puedo hacer pruebas pero propongo probar con esta definición:
Código Delphi [-]
uses
  Windows.....

type
{$ALIGN 1}
TSSP_COMMAND = record
  Key: TSSP_FULL_KEY;
  BaudRate: ULONG;  //Cardinal
  Timeout: ULONG;
  PortNumber: BYTE; // AnsiChar
  SSPAddress: BYTE;
  RetryLevel: BYTE;
  EncryptionStatus: BYTE;
  CommandDataLength: BYTE;
  CommandData: Array[0..255-1] of BYTE;
  ResponseStatus: Byte;
  ResponseDataLength: Byte;
  ResponseData: Array[0..255-1] of BYTE;
  IgnoreError: BYTE;
end;
{$ALIGN OFF}

Se fuerza una alineación a 1 pero se puede forzar a también a 2, 4, 8 o 16. Para una alineación = 1 sizeof(TSSP_COMMAND) devolvería 542

Diego E. los copiladores no interpretan nada revuelto simplemente cometemos errores en el tamaño de los tipos o su alineación. Otra forma de equivocarse es en interpretar erróneamente los datos con sus punteros.


Saludos.
Responder Con Cita
Respuesta



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
Llamar a funcion sin definir todos los parametros oscarac OOP 20 23-03-2011 23:10:54
Funcion de IAppServer con parametros out delphijm Providers 2 02-03-2011 13:21:59
funcion con parametros out comba Internet 2 20-10-2010 16:45:11
¿Una función en Delphi, puede devolver varios parámetros? socger Varios 6 27-02-2009 18:00:07
Que hace esta función en VB? mqm Varios 1 15-10-2007 20:30:15


La franja horaria es GMT +2. Ahora son las 17:58:55.


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