Recent

Author Topic: LazSerial - DataModule  (Read 2281 times)

FOV_2001

  • New Member
  • *
  • Posts: 21
LazSerial - DataModule
« on: December 12, 2019, 08:30:48 pm »
Hola a todos,
Luego de mucho buscar, me encuentro es esta extraña situación, de la cual espero me ayuden a encontrar una salida.
Tengo FPC y Lazarus a la ultima versión instalada.

Por razones de diseño, tengo una aplicación principal y librerías que son llamadas en forma dinámica, y que a su vez vía puertos seriales, acceden a dispositivos.

Esta aplicación, esta compilada en Windows, y funciona perfectamente, en Linux me ocurre algo muy particular.
Como primera confesión, mis conocimientos de Linux son bastante limitados.

El problema surge con LazSerial, el cual esta instanciado en la librería

La aplicación, vía un botón, llama a la librería, levanta las direcciones de cada procedimiento  o función exportado, y con otro botón bien básico para intentar descubrir el problema, llamo a la rutina que inicializa el puerto.

Lo configura, lo abre, y comienzan las cosas que no consigo entender.

Levanta el puerto. Se genera el evento de puerto conectado, luego se genera el evento de puerto CERRADO, lo sigo debbugueando, y a la hora de llamar a la unit DetaSerialPort, intenta instanciar el puerto físico (DataSerialPort es parte de LazSerial), en la linea 332, a travez de un Create  y se cuelga el programa, donde la única forma de salir es abortando.

Lo extraño es que no da ninguna señal de error, simplemente se va a Sirio.

Agrego para mayor detalle lo mínimo básico que he hecho a ver si alguno de ustedes me puede dedicar unos minutos para orientarme ya que no se para donde correr.

Solo como comentario, los Programas Demo de cada componente, acceden a los puertos, sin ningún problema, o sea los puertos serie están disponibles y funcionan.

Code: Pascal  [Select][+][-]
  1.  
  2. unit serial1;
  3.  
  4. {$mode objfpc}{$H+}
  5.  
  6. interface
  7.  
  8. uses
  9.   Classes, SysUtils, IniFiles, LazSerial, LazSynaSer;
  10.  
  11. const
  12.   Prefix = 'BV EBDS';
  13.   CTRL_Omnibus   = $10;
  14.   CTRL_Calibrate = $40;
  15.   CTRL_Download  = $50;
  16.   CTRL_Auxiliary = $60;
  17.   CTRL_Extended  = $70;
  18.  
  19.  
  20. type
  21.  
  22.   { TMod_Billetero }
  23.  
  24.   TMod_Billetero = class(TDataModule)
  25.     LazSerial1: TLazSerial;
  26.     procedure LazSerial1Status(Sender: TObject; Reason: THookSerialReason;
  27.       const Value: string);
  28.   private
  29.     PP  :String;
  30.     Function  Conectar( Inicializar_BV: Boolean): Integer;
  31.  
  32.   public
  33.  
  34.     Function  Start_Up (Boot_BV: Boolean): Longint;
  35.     Function  Cerrar: Longint;
  36.  
  37.   end;
  38.  
  39. var
  40.   Mod_Billetero: TMod_Billetero;
  41.  
  42. implementation
  43.  
  44. {$R *.lfm}
  45.  
  46. Function TMod_Billetero.Cerrar: Longint;
  47. begin
  48.   //TXTime.Enabled:=false;
  49.   //RXTime.Enabled:=false;
  50.  
  51.   if LazSerial1.Active then
  52.     begin
  53.       LazSerial1.SynSer.Purge;
  54.       LazSerial1.Close;
  55.     end;
  56.  
  57.  { if BV_Bill_Config.Operativo then
  58.     begin
  59.       BV_Bill_Config.Operativo := False;
  60.     end; }
  61.  
  62.   {if Activar_Logs then
  63.     Registro_Log(Archivo_Logs,Prefix,'DLL Correctamente Cerrada');  }
  64.  
  65.   Result := 0;
  66. end;
  67.  
  68. Function TMod_Billetero.Start_Up (Boot_BV: Boolean) : Integer;
  69. var
  70.  Log_Dir : String;
  71.  Temp_Str : String;
  72.  FIniFileName : String;
  73.  Grabar : Boolean;
  74.  IniFile : TIniFile;
  75.  Temp_Int : Integer;
  76.  App_Name : String;
  77.  
  78. begin
  79.   {$IFDEF LINUX}
  80.    IniFile := TIniFile.Create(GetAppConfigFile(False) + '.conf');
  81.   {$ELSE}
  82.    IniFile := TIniFile.Create(
  83.    ExtractFilePath(Application.EXEName) + 'SimuGps.ini');
  84.   {$ENDIF}
  85.  
  86. {  Temp_Str := ExtractFilePath  (Get_Aplication_Name);
  87.   {$IFDEF MSWINDOWS}
  88.   Log_Dir  := Temp_Str + 'Logs\';
  89.   {$ENDIF}
  90.  
  91.   {$IFDEF Linux}
  92.   Log_Dir  := Temp_Str + 'Logs';
  93.   {$ENDIF}
  94.  
  95.   if Not DirectoryExists(Log_Dir) then
  96.     CreateDir(Log_Dir);
  97.  
  98.   Temp_Str := ExtractFileName(Get_Aplication_Name);
  99.  
  100.   Archivo_logs := ChangeFileExt(Temp_Str,'.log');
  101.  
  102.   {$IFDEF MSWINDOWS}
  103.   Archivo_Logs := Log_Dir + Archivo_Logs;
  104.   {$ENDIF}
  105.  
  106.   Temp_Str := Get_Aplication_Name;
  107.   App_Name := Temp_Str;
  108.  
  109.   FIniFileName := ChangeFileExt(Temp_Str, '.ini');
  110.  
  111.   Grabar := False;
  112.  
  113.   if Not FileExists(FIniFilename) then
  114.      begin
  115.        Grabar := True;
  116.      end;
  117.  
  118.   IniFile      := TIniFile.Create(FIniFileName);
  119.  
  120.   Temp_Int := IniFile.ReadInteger('LOGS', 'Activar', 1);
  121.  
  122.   if Temp_Int = -1 then
  123.     begin
  124.       Grabar := true;
  125.       Activar_Logs := True;
  126.     end
  127.   else
  128.     Activar_Logs := (Temp_Int = 1);
  129.  
  130.   Temp_Int := IniFile.ReadInteger('LOGS', 'Nivel', -1);
  131.  
  132.   if Temp_Int = -1 then
  133.     begin
  134.       Grabar := true;
  135.       Log_Level := L_Info;
  136.     end
  137.   else
  138.     Log_Level := Temp_Int;
  139.  
  140.   Temp_Int := IniFile.ReadInteger('Lenguaje', 'Idioma', -1);
  141.  
  142.   if Temp_Int = -1 then
  143.     begin
  144.       Grabar := true;
  145.       LenguajeIndex := 1;
  146.     end
  147.   else
  148.     LenguajeIndex := Temp_Int;
  149.  
  150.   if Grabar then
  151.     begin
  152.       if Activar_Logs then
  153.         IniFile.WriteInteger('LOGS', 'Activar', 1)
  154.       else
  155.         IniFile.WriteInteger('LOGS', 'Activar', 0);
  156.     end;
  157.  
  158.   IniFile.Free;
  159.  
  160.   if Activar_Logs then
  161.     begin
  162.       Registro_Log(Archivo_Logs,Prefix,'#################################');
  163.       Registro_Log(Archivo_Logs,Prefix,'           EBDSCOMM');
  164.       Registro_Log(Archivo_Logs,Prefix,' Iniciando Servicio por Start_Up');
  165.       Registro_Log(Archivo_Logs,Prefix,'#################################');
  166.       Registro_Log(Archivo_Logs,Prefix,'Version de DLL : ' + About);
  167.       Registro_Log(Archivo_Logs,Prefix,'Indentificador de Hardware : ' + Get_Identifier);
  168.     end;
  169.  
  170.   if Leer_Valores_Default then // Arranco con algo configurado por las dudas
  171.     begin
  172.       if Not Load_Variables_Entorno_Puerto(true) then // Si no esta configurado - Configuro y Guardo
  173.         begin
  174.           Result := -2;
  175.           Exit;
  176.         end
  177.       else
  178.         if Not Load_Variables_Entorno_Billetes(true) then // Si no esta configurado - Configuro y Guardo
  179.           begin
  180.             Result := -2;
  181.             Exit;
  182.           end
  183.         else
  184.           begin
  185.             Cargar_Tabla_Paises;
  186.             BV_Protocolo := 'EBDS';
  187.             StrPLCopy(PChar(@BV_Bill_Config.Protocolo[0]), BV_Protocolo, High(BV_Bill_Config.Protocolo));  }
  188.             Result := Conectar(Boot_BV);
  189.        {   end;
  190.     end
  191.   else
  192.     begin // Aca no deberia entrar NUNCA
  193.       Result := -1;
  194.       Exit;
  195.     end;    }
  196. end;
  197.  
  198. procedure TMod_Billetero.LazSerial1Status(Sender: TObject;
  199.   Reason: THookSerialReason; const Value: string);
  200. begin
  201.   case Reason of
  202.      HR_SerialClose : begin
  203.                         pp :='Cerrado';
  204. //                        StatusBar1.SimpleText := 'Port ' + Value + ' closed';
  205.                       end;
  206.      HR_Connect     : begin
  207.                         pp :='Conectado';
  208. //                        StatusBar1.SimpleText := 'Port ' + Value + ' connected';
  209.                       end;
  210.      HR_CanRead     : begin
  211.                         pp :='Puede Leer';
  212. //                        StatusBar1.SimpleText := 'CanRead : ' + Value ;
  213.                       end;
  214.      HR_CanWrite    : begin
  215.                         pp :='Puede Escribir';
  216. //                        StatusBar1.SimpleText := 'CanWrite : ' + Value ;
  217.                       end;
  218.      HR_ReadCount   : begin
  219.                         pp :='Conteo de Lectura';
  220. //                        StatusBar1.SimpleText := 'ReadCount : ' + Value ;
  221.                       end;
  222.      HR_WriteCount  : begin
  223.                         pp :='Conteo de Escritura';
  224. //                        StatusBar1.SimpleText := 'WriteCount : ' + Value ;
  225.                       end;
  226.      HR_Wait        : begin
  227.                         pp :='Wait';
  228. //                        StatusBar1.SimpleText := 'Wait : ' + Value ;
  229.                       end;
  230.    end ;
  231.  
  232. end;
  233.  
  234. Function  TMod_Billetero.Conectar( Inicializar_BV: Boolean): Integer;
  235. begin
  236.   LazSerial1.Device:= '/dev/ttyUSB0';
  237.   LazSerial1.DataBits:= db7bits;
  238.   LazSerial1.Parity:= pEven;
  239.   LazSerial1.BaudRate:= br__9600;
  240.   LazSerial1.open;
  241.   Result := 0;
  242. end;
  243.  
  244.  
  245. initialization
  246.     try
  247.       Mod_Billetero := TMod_Billetero.Create(nil);
  248.   except
  249.     begin
  250.       //Result := -1;
  251.     end;
  252.   end;
  253.  
  254. finalization
  255.   if Assigned(Mod_Billetero) then
  256.     begin
  257.       FreeAndNil(Mod_Billetero);
  258.     end;
  259. end.
  260.  
  261.  

Dicho sea de paso, inntenté cambiar de LazSerial a DataPort, y al momento de instanciar el puerto, se cuelga de la misma forma.

FOV_2001

  • New Member
  • *
  • Posts: 21
Re: LazSerial - DataModule
« Reply #1 on: December 12, 2019, 08:51:32 pm »
Solo como comentario extra, ya agregué mi usuario al grupo dialout, y sigue sin funcionar.

astrocar

  • Newbie
  • Posts: 2
Re: LazSerial - DataModule
« Reply #2 on: November 26, 2020, 01:55:01 pm »
Hola a todos,
Luego de mucho buscar, me encuentro es esta extraña situación, de la cual espero me ayuden a encontrar una salida.
Tengo FPC y Lazarus a la ultima versión instalada.

Por razones de diseño, tengo una aplicación principal y librerías que son llamadas en forma dinámica, y que a su vez vía puertos seriales, acceden a dispositivos.

Esta aplicación, esta compilada en Windows, y funciona perfectamente, en Linux me ocurre algo muy particular.
Como primera confesión, mis conocimientos de Linux son bastante limitados.

El problema surge con LazSerial, el cual esta instanciado en la librería

La aplicación, vía un botón, llama a la librería, levanta las direcciones de cada procedimiento  o función exportado, y con otro botón bien básico para intentar descubrir el problema, llamo a la rutina que inicializa el puerto.

Lo configura, lo abre, y comienzan las cosas que no consigo entender.

Levanta el puerto. Se genera el evento de puerto conectado, luego se genera el evento de puerto CERRADO, lo sigo debbugueando, y a la hora de llamar a la unit DetaSerialPort, intenta instanciar el puerto físico (DataSerialPort es parte de LazSerial), en la linea 332, a travez de un Create  y se cuelga el programa, donde la única forma de salir es abortando.

Lo extraño es que no da ninguna señal de error, simplemente se va a Sirio.

Agrego para mayor detalle lo mínimo básico que he hecho a ver si alguno de ustedes me puede dedicar unos minutos para orientarme ya que no se para donde correr.

Solo como comentario, los Programas Demo de cada componente, acceden a los puertos, sin ningún problema, o sea los puertos serie están disponibles y funcionan.

Code: Pascal  [Select][+][-]
  1.  
  2. unit serial1;
  3.  
  4. {$mode objfpc}{$H+}
  5.  
  6. interface
  7.  
  8. uses
  9.   Classes, SysUtils, IniFiles, LazSerial, LazSynaSer;
  10.  
  11. const
  12.   Prefix = 'BV EBDS';
  13.   CTRL_Omnibus   = $10;
  14.   CTRL_Calibrate = $40;
  15.   CTRL_Download  = $50;
  16.   CTRL_Auxiliary = $60;
  17.   CTRL_Extended  = $70;
  18.  
  19.  
  20. type
  21.  
  22.   { TMod_Billetero }
  23.  
  24.   TMod_Billetero = class(TDataModule)
  25.     LazSerial1: TLazSerial;
  26.     procedure LazSerial1Status(Sender: TObject; Reason: THookSerialReason;
  27.       const Value: string);
  28.   private
  29.     PP  :String;
  30.     Function  Conectar( Inicializar_BV: Boolean): Integer;
  31.  
  32.   public
  33.  
  34.     Function  Start_Up (Boot_BV: Boolean): Longint;
  35.     Function  Cerrar: Longint;
  36.  
  37.   end;
  38.  
  39. var
  40.   Mod_Billetero: TMod_Billetero;
  41.  
  42. implementation
  43.  
  44. {$R *.lfm}
  45.  
  46. Function TMod_Billetero.Cerrar: Longint;
  47. begin
  48.   //TXTime.Enabled:=false;
  49.   //RXTime.Enabled:=false;
  50.  
  51.   if LazSerial1.Active then
  52.     begin
  53.       LazSerial1.SynSer.Purge;
  54.       LazSerial1.Close;
  55.     end;
  56.  
  57.  { if BV_Bill_Config.Operativo then
  58.     begin
  59.       BV_Bill_Config.Operativo := False;
  60.     end; }
  61.  
  62.   {if Activar_Logs then
  63.     Registro_Log(Archivo_Logs,Prefix,'DLL Correctamente Cerrada');  }
  64.  
  65.   Result := 0;
  66. end;
  67.  
  68. Function TMod_Billetero.Start_Up (Boot_BV: Boolean) : Integer;
  69. var
  70.  Log_Dir : String;
  71.  Temp_Str : String;
  72.  FIniFileName : String;
  73.  Grabar : Boolean;
  74.  IniFile : TIniFile;
  75.  Temp_Int : Integer;
  76.  App_Name : String;
  77.  
  78. begin
  79.   {$IFDEF LINUX}
  80.    IniFile := TIniFile.Create(GetAppConfigFile(False) + '.conf');
  81.   {$ELSE}
  82.    IniFile := TIniFile.Create(
  83.    ExtractFilePath(Application.EXEName) + 'SimuGps.ini');
  84.   {$ENDIF}
  85.  
  86. {  Temp_Str := ExtractFilePath  (Get_Aplication_Name);
  87.   {$IFDEF MSWINDOWS}
  88.   Log_Dir  := Temp_Str + 'Logs\';
  89.   {$ENDIF}
  90.  
  91.   {$IFDEF Linux}
  92.   Log_Dir  := Temp_Str + 'Logs';
  93.   {$ENDIF}
  94.  
  95.   if Not DirectoryExists(Log_Dir) then
  96.     CreateDir(Log_Dir);
  97.  
  98.   Temp_Str := ExtractFileName(Get_Aplication_Name);
  99.  
  100.   Archivo_logs := ChangeFileExt(Temp_Str,'.log');
  101.  
  102.   {$IFDEF MSWINDOWS}
  103.   Archivo_Logs := Log_Dir + Archivo_Logs;
  104.   {$ENDIF}
  105.  
  106.   Temp_Str := Get_Aplication_Name;
  107.   App_Name := Temp_Str;
  108.  
  109.   FIniFileName := ChangeFileExt(Temp_Str, '.ini');
  110.  
  111.   Grabar := False;
  112.  
  113.   if Not FileExists(FIniFilename) then
  114.      begin
  115.        Grabar := True;
  116.      end;
  117.  
  118.   IniFile      := TIniFile.Create(FIniFileName);
  119.  
  120.   Temp_Int := IniFile.ReadInteger('LOGS', 'Activar', 1);
  121.  
  122.   if Temp_Int = -1 then
  123.     begin
  124.       Grabar := true;
  125.       Activar_Logs := True;
  126.     end
  127.   else
  128.     Activar_Logs := (Temp_Int = 1);
  129.  
  130.   Temp_Int := IniFile.ReadInteger('LOGS', 'Nivel', -1);
  131.  
  132.   if Temp_Int = -1 then
  133.     begin
  134.       Grabar := true;
  135.       Log_Level := L_Info;
  136.     end
  137.   else
  138.     Log_Level := Temp_Int;
  139.  
  140.   Temp_Int := IniFile.ReadInteger('Lenguaje', 'Idioma', -1);
  141.  
  142.   if Temp_Int = -1 then
  143.     begin
  144.       Grabar := true;
  145.       LenguajeIndex := 1;
  146.     end
  147.   else
  148.     LenguajeIndex := Temp_Int;
  149.  
  150.   if Grabar then
  151.     begin
  152.       if Activar_Logs then
  153.         IniFile.WriteInteger('LOGS', 'Activar', 1)
  154.       else
  155.         IniFile.WriteInteger('LOGS', 'Activar', 0);
  156.     end;
  157.  
  158.   IniFile.Free;
  159.  
  160.   if Activar_Logs then
  161.     begin
  162.       Registro_Log(Archivo_Logs,Prefix,'#################################');
  163.       Registro_Log(Archivo_Logs,Prefix,'           EBDSCOMM');
  164.       Registro_Log(Archivo_Logs,Prefix,' Iniciando Servicio por Start_Up');
  165.       Registro_Log(Archivo_Logs,Prefix,'#################################');
  166.       Registro_Log(Archivo_Logs,Prefix,'Version de DLL : ' + About);
  167.       Registro_Log(Archivo_Logs,Prefix,'Indentificador de Hardware : ' + Get_Identifier);
  168.     end;
  169.  
  170.   if Leer_Valores_Default then // Arranco con algo configurado por las dudas
  171.     begin
  172.       if Not Load_Variables_Entorno_Puerto(true) then // Si no esta configurado - Configuro y Guardo
  173.         begin
  174.           Result := -2;
  175.           Exit;
  176.         end
  177.       else
  178.         if Not Load_Variables_Entorno_Billetes(true) then // Si no esta configurado - Configuro y Guardo
  179.           begin
  180.             Result := -2;
  181.             Exit;
  182.           end
  183.         else
  184.           begin
  185.             Cargar_Tabla_Paises;
  186.             BV_Protocolo := 'EBDS';
  187.             StrPLCopy(PChar(@BV_Bill_Config.Protocolo[0]), BV_Protocolo, High(BV_Bill_Config.Protocolo));  }
  188.             Result := Conectar(Boot_BV);
  189.        {   end;
  190.     end
  191.   else
  192.     begin // Aca no deberia entrar NUNCA
  193.       Result := -1;
  194.       Exit;
  195.     end;    }
  196. end;
  197.  
  198. procedure TMod_Billetero.LazSerial1Status(Sender: TObject;
  199.   Reason: THookSerialReason; const Value: string);
  200. begin
  201.   case Reason of
  202.      HR_SerialClose : begin
  203.                         pp :='Cerrado';
  204. //                        StatusBar1.SimpleText := 'Port ' + Value + ' closed';
  205.                       end;
  206.      HR_Connect     : begin
  207.                         pp :='Conectado';
  208. //                        StatusBar1.SimpleText := 'Port ' + Value + ' connected';
  209.                       end;
  210.      HR_CanRead     : begin
  211.                         pp :='Puede Leer';
  212. //                        StatusBar1.SimpleText := 'CanRead : ' + Value ;
  213.                       end;
  214.      HR_CanWrite    : begin
  215.                         pp :='Puede Escribir';
  216. //                        StatusBar1.SimpleText := 'CanWrite : ' + Value ;
  217.                       end;
  218.      HR_ReadCount   : begin
  219.                         pp :='Conteo de Lectura';
  220. //                        StatusBar1.SimpleText := 'ReadCount : ' + Value ;
  221.                       end;
  222.      HR_WriteCount  : begin
  223.                         pp :='Conteo de Escritura';
  224. //                        StatusBar1.SimpleText := 'WriteCount : ' + Value ;
  225.                       end;
  226.      HR_Wait        : begin
  227.                         pp :='Wait';
  228. //                        StatusBar1.SimpleText := 'Wait : ' + Value ;
  229.                       end;
  230.    end ;
  231.  
  232. end;
  233.  
  234. Function  TMod_Billetero.Conectar( Inicializar_BV: Boolean): Integer;
  235. begin
  236.   LazSerial1.Device:= '/dev/ttyUSB0';
  237.   LazSerial1.DataBits:= db7bits;
  238.   LazSerial1.Parity:= pEven;
  239.   LazSerial1.BaudRate:= br__9600;
  240.   LazSerial1.open;
  241.   Result := 0;
  242. end;
  243.  
  244.  
  245. initialization
  246.     try
  247.       Mod_Billetero := TMod_Billetero.Create(nil);
  248.   except
  249.     begin
  250.       //Result := -1;
  251.     end;
  252.   end;
  253.  
  254. finalization
  255.   if Assigned(Mod_Billetero) then
  256.     begin
  257.       FreeAndNil(Mod_Billetero);
  258.     end;
  259. end.
  260.  
  261.  

Dicho sea de paso, inntenté cambiar de LazSerial a DataPort, y al momento de instanciar el puerto, se cuelga de la misma forma.
hola buen dia estoy en un caso parecido con puerto serial pero lo quiero manejar por libreria dll.
saludos como van tus avance

 

TinyPortal © 2005-2018