Acesso a porta Serial

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
agostini
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Ter, 23 Jan 2007 10:08 pm
Localização: Porto Alegre - RS

Olá pessoal!
Gostaria de saber se alguém jé acessou a porta serial (COM1)???
Na verdade tenho um equipamento conectado na COM1 e quero obter dados da porta!???
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

No Forms, eu já vi várias vezes situações como essa.
Na verdade, o forms não conecta na serial. Quem faz isso é uma DLL (em C, Delphi, etc) e o Forms se conecta nela atravez do ORA_FFI. (que é uma interface entre a DLL e o forms)

No banco, eu nunca vi, mas creio que seja da mesma forma:
* Um programa fica escutando a porta COM e envia a informação para o oracle ler. (talvez até via texto seja possível)

:cry:
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Olá pessoal!

Aproveitando o tópico, estou com um probleminha para realizar a transmissão de dados via porta serial (por enquanto, estou utilizando o componente MSCOMM.OCX, importando as interfaces OLE para o forms - Menu Program > Import OLE Library Interfaces. Se alguém tiver uma outra sugestão, aceito qualquer coisa :P).

Eis a situação:

Eu preciso enviar informações (dados binários) para uma determinada porta serial.

Consegui fazer tudo funcionar quase perfeitamente, utilizando o método Output da biblioteca MSCOMM.OCX, apenas com um problema:
Quando eu tento enviar o byte 0x00/chr(0), ele é ignorado pela biblioteca (enviando os dados byte a byte). Se eu tentar enviar os dados em uma única string, todos os bytes a partir do caracter 0x00 são ignorados.

Andei invesitgando, e aparentemente o motivo é que strings em Visual Basic (linguagem em que o componente foi feito), são finalizadas com este caracter.

Alguém por acaso já se deparou com este problema? Ou por acaso teria alguma alternativa?

Abaixo está a minha procedure:

Selecionar tudo

procedure p_envida_dados
( p_porta     in number
) is

  comm_hnd      ole2.obj_type;

begin

  synchronize;

  comm_hnd := ole2.create_obj('MSCOMMLib.MSComm');
  MSCOMMLib_IMSComm.CommPort( comm_hnd, p_porta );      -- Define a porta serial
  MSCOMMLib_IMSComm.Settings( comm_hnd, '9600,N,8,2' ); -- Define as propriedades de conexão
  
  MSCOMMLib_IMSComm.PortOpen( comm_hnd, 1 );            -- Abre a porta
  
  ret := MSCOMMLib_IMSComm.PortOpen( comm_hnd );        -- Verifica se a porta foi aberta
  if ret = 0 then
    msg('Erro ao abrir a conexão!', 'I', true);
  end if;
  
  -- Define demais parâmetros da conexão
  MSCOMMLib_IMSComm.InputMode  ( comm_hnd, MSCOMMLib_Constants.comInputModeBinary );
  MSCOMMLib_IMSComm.NullDiscard( comm_hnd, 1 );
  MSCOMMLib_IMSComm.InputLen   ( comm_hnd, 0 );
  MSCOMMLib_IMSComm.EOFEnable  ( comm_hnd, 26 );
  MSCOMMLib_IMSComm.DTREnable  ( comm_hnd, 0 );
  MSCOMMLib_IMSComm.RTSEnable  ( comm_hnd, 0 );
  --
  
  dbms_lock.sleep(seconds => .5);
  
  MSCOMMLib_IMSComm.InBufferCount( comm_hnd, 0 );       -- Limpa o buffer de entrada
  -- teste 01 - Enviando uma única string -- InputLen = 0
  --   Neste caso, só o byte "02" é enviado até o hardware
  MSCOMMLib_IMSComm.Output( comm_hnd, to_variant(utl_raw.cast_to_varchar2('020005FF')));
  MSCOMMLib_IMSComm.InBufferCount( comm_hnd, 0 );       -- Limpa o buffer de entrada
  --
  -- teste 02 - Enviando a string byte a byte -- InputLen = 1
  --  Neste caso, chegam até o hardware os caracteres "0205FF" - O caracter 00 é ignorado
  MSCOMMLib_IMSComm.Output( comm_hnd, to_variant(utl_raw.cast_to_varchar2('02')));
  dbms_lock.sleep(seconds => .1);
  MSCOMMLib_IMSComm.Output( comm_hnd, to_variant(utl_raw.cast_to_varchar2('00')));
  dbms_lock.sleep(seconds => .1);
  MSCOMMLib_IMSComm.Output( comm_hnd, to_variant(utl_raw.cast_to_varchar2('05')));
  dbms_lock.sleep(seconds => .1);
  MSCOMMLib_IMSComm.Output( comm_hnd, to_variant(utl_raw.cast_to_varchar2('FF')));
  dbms_lock.sleep(seconds => .1);
  MSCOMMLib_IMSComm.InBufferCount( comm_hnd, 0 );       -- Limpa o buffer de entrada
  --
  -- teste 03 - chamando a função Set_Ole forçando o byte a ser tratado 
  --            como numérico -- InputLen = 1
  --   Neste caso, o forms dispara o erro 0x80020005 - Type mismatch
  MSCOMMLib_IMSComm.Output( comm_hnd, to_variant(utl_raw.cast_to_varchar2('02')));
  dbms_lock.sleep(seconds => .1);
  -- tratmento especial para o byte 00
  Init_OleArgs(1);
  Set_Ole(comm_hnd, 25, 0, VT_R8);
  --
  dbms_lock.sleep(seconds => .1);
  MSCOMMLib_IMSComm.Output( comm_hnd, to_variant(utl_raw.cast_to_varchar2('05')));
  dbms_lock.sleep(seconds => .1);
  MSCOMMLib_IMSComm.Output( comm_hnd, to_variant(utl_raw.cast_to_varchar2('FF')));
  dbms_lock.sleep(seconds => .1);
  MSCOMMLib_IMSComm.InBufferCount( comm_hnd, 0 );       -- Limpa o buffer de entrada
  --
  MSCOMMLib_IMSComm.PortOpen( comm_hnd, 0);             -- Fecha a porta
  
  ole2.release_obj( comm_hnd );                         -- Libera o objeto OLE

end;
Valeu!
pyro
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 323
Registrado em: Qui, 21 Set 2006 10:21 am
Localização: Barala - TT

Só uma sugestão, você pode utilizar Java para ler e tratar os dados retornados pela serial. O Java é bem perfomático para uma tarefa dessas, se quiser saber mais sobre comunicação serial no Java é só acessar aqui: http://www.viamais.net/blog/?cat=6

Depois da aplicação pronta e compilada em jar dá para você integrar ao seu forms.
Shakall
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 29
Registrado em: Qua, 13 Ago 2008 6:57 pm
Localização: Blumenau - SC

Estou com um problema acho que vocês podem me ajudar, criei uma classer java que se comunica com a porta serial com6, estou utilizando o comm.jar para se comunicar com a porta, o problema é que preciso passar para o oracle uma dll, como fazer isso? Obrigado.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 31 visitantes