Página 1 de 3
Porta serial no Harbour
Enviado: 08 Mai 2013 11:52
por Hasse
Bom dia colegas.
Ainda estou programando com xHarbour, mas lentamente, nas horas vagas ("meio-vagas"...), faço testes. Agora resolvi fazer algo para valer.
Um pequeno aplicativo, rodando em background, para ler porta serial.
Estou usando a MiniGui 3.0.35 (Harbour 2.0.0 (r13372)). Optei por esta porque li em algum fórum que é a mais fácil para os iniciantes.
Navegando li texto do 'Przemek' tratando de comunicação serial que diz:
Please forget about HBCOMM.
This library was never working correctly.
Current HBCOMM in Harbour SVN is wrapper to native serial port support
in Harbour.
It should work but is not bug compatible with originalimplementation
so existing code has to be updated in some cases.
Instead of HBCOMM use native Harbour serial port functions which are
part of Harbour RTL.
Below is list of PRG level serial functions: HB_COM*().
You can also use COM_*() functions from HBCT library.
Both interfaces use the same low level C code from Harbour RTL and
they work on all platforms (DOS, Win, OS2, *nixes).
BTW This CT3 COM implementation is more completed then the commercial
one sold by xHarbour.com. It also works on all platforms.
best regards,
Przemek
Pergunto: Esta versão da MiniGui x Harbour já dá suporte à comunicação serial nativa ?
Isto porque também li que esta LIB nativa só foi implementada à partir de determinada versão do Harbour, e não sei qual é...
Alguém pode mostrar o "caminho das pedras" ?
Algum colega possui a documentação das funções desta LIB ?
Eu tenho a lista das funções disponíveis, mas é só...
Fiz alguns testes com as funções de abertura da porta e dá erro:
undefined reference to `HB_FUN_HB_COMINIT'
Suponho que seja por falta de suporte da versão que estou usando...
Sds.
Porta serial no Harbour
Enviado: 08 Mai 2013 13:02
por Jairo Maia
Olá Hasse,
Hasse escreveu:Algum colega possui a documentação das funções desta LIB ?
Veja neste link:
Introduction Serial Communications
Uso a HBCT para ler peso das Balanças Toledo, e funciona ok.
Porta serial no Harbour
Enviado: 10 Mai 2013 22:22
por Hasse
Olá Jairo.
Obrigado pelo retorno.
Entretanto, usando a HBCT.lib, extraida do HMG 2.0 e a Lista de Funções do site que você indicou não funciona.
Testei somente com as 3 funções de abertura da porta serial:
Código: Selecionar todos
nHandle := COMINIT( 1, 9600, 8, 8000, 1 )
nHandle := HB_COMINIT( 1, 9600, 8, 8000, 1 )
nHandle := INIT_PORT( 1, 9600, 8, 0, 1, 6000 )
As 2 formas geram o mesmo erro:
linker .hbmk\win\mingw\teste.o:teste.prg: undefined reference to `HB_FUN_HB_COMINIT'
Onde está o meu erro ?
Porta serial no Harbour
Enviado: 10 Mai 2013 22:32
por sygecom
Hasse,
Pode ser que seja sua versão do Harbour que esteja desatualizada, pro que isso já existe no Harbour na lib HBRTL.LIB
Código: Selecionar todos
2010-06-09 18:37 UTC+0300 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt)
+ harbour/src/rtl/hbcomhb.c
* harnour/src/rtl/Makefile
* harbour/include/hbextern.ch
+ added wrapper functions for Serial communication port API
The list of exported functions is:
HB_COMCLOSE( nPort ) --> lSuccess
HB_COMDISCARDCHAR( nPort, nChar | cChar ) --> lSuccess
HB_COMERRORCHAR( nPort, nChar | cChar ) --> lSuccess
HB_COMFLOWCHARS( nPort, nXONchar | cXONchar, nXOFFchar | cXOFFchar ) --> lSuccess
HB_COMFLOWCONTROL( nPort, @iValue, nFlow ) --> lSuccess
HB_COMFLOWSET( nPort, nFlow ) --> lSuccess
HB_COMFLUSH( nPort, [ nType = HB_COM_IOFLUSH ] ) --> lSuccess
HB_COMGETDEVICE( nPort ) --> cDeviceName
HB_COMGETERROR( nPort ) --> nError
HB_COMGETOSERROR( nPort ) --> nError
HB_COMINIT( nPort, nBaud, cParity, nSize, nStop ) --> lSuccess
HB_COMINPUTCOUNT( nPort ) --> nCount
HB_COMINPUTSTATE( nPort ) --> nState
HB_COMLASTNUM() --> nLastPortNumber
HB_COMLSR( nPort, @nValue ) --> lSuccess
HB_COMMCR( nPort, @nValue, nClear, nSet ) --> lSuccess
HB_COMMSR( nPort, @nValue ) --> lSuccess
HB_COMOPEN( nPort ) --> lSuccess
HB_COMOUTPUTCOUNT( nPort ) --> nCount
HB_COMOUTPUTSTATE( nPort ) --> nState
HB_COMSENDBREAK( nPort, [ nDuration = 50 ] ) --> lSuccess
HB_COMSETDEVICE( nPort, cDeviceName ) --> lSuccess
HB_COMRECV( nPort, @cBuffer, [ nLen = LEN( cBuffer ) ], [ nTimeout = 0 ] ) --> nBytesRecv
HB_COMSEND( nPort, cBuffer, [ nLen = LEN( cBuffer ) ], [ nTimeout = 0 ] ) --> nBytesSent
Porta serial no Harbour
Enviado: 10 Mai 2013 22:52
por Hasse
OK.
Vou instalar uma versão mais atualizada do Harbour.
Porta serial no Harbour
Enviado: 11 Mai 2013 11:57
por HASA

)
Olá para todos, Leonardo eu conseguiria reproduzir esses comandos para abertura da Gaveta Gerbo 3260 em porta serial ?, uso xHarbour e não consigo migrar para HARBOUR por não conseguir migrar essas funções:
Código: Selecionar todos
**
** ABRE A PORTA DA GAVETA **
**
Function abreportagaveta()
LOCAL cCom := "COM2:"
LOCAL nBaudeRate := 9600
LOCAL nDatabits := 8
LOCAL nParity := 0
LOCAL nStopbit := 0
LOCAL nBufferSize := 512
LOCAL nhandle
LOCAL nby,nBytes
LOCAL xDAta
nHandle := Init_Port( cCom ,;
nBaudeRate ,;
nDatabits ,;
nParity ,;
nStopbit ,;
nBufferSize )
IF !Empty( nHandle ) // porta ok
SETHANDSHAKE(nHandle,3 )
// limpa status da gaveta
SETCOMOPTIONS(nhandle,SETDTR)
SETCOMOPTIONS(nhandle,CLRRTS)
**
** DA A CARGA NO SELANOIDE **
**
#ifndef __XHARBOUR__
DELAY( 6 )
#ELSE
Threadsleep( 6000 )
#endif
*
ELSE
PLAYEXCLAMATION()
MSGSTOP('Não foi possível Abrir a Porta de comunicação com a Gaveta !!!', SISTEMA )
Endif
Return nHandle
**
** ABRE A GAVETA PROPRIAMENTE DITA **
**
Function abregaveta( QUAL )
IF Qual = 1
Fechaporta()
Else
*
SETCOMOPTIONS( nhandle, SETRTS )
#ifndef __XHARBOUR__
DELAY( 2 )
#ELSE
Threadsleep( 200 )
#endif
*
SETCOMOPTIONS( nhandle, CLRRTS )
#ifndef __XHARBOUR__
DELAY( 1 )
#ELSE
Threadsleep( 100 )
#endif
*
endif
return nil
**
** INFORMA SE GAVETA ABERTA OU FECHADA **
**
Function Statusgaveta()
LOCAL X := Iscts( nHandle )
Return If( X ,"Aberta", "Fechada" )
**
** FECHA A PORTA DE COMUNICACAO DA GAVETA **
**
Function Fechaporta()
UNINT_PORT( nHandle )
return nil
HASA
Porta serial no Harbour
Enviado: 11 Mai 2013 16:57
por Jairo Maia
Olá Hasse,
Primeiro uma observação: A função para abrir a porta é a Com_Open( nPorta ). O comando que você tentou usar é para iniciar a porta, e ele só pode ser usado numa porta previamente aberta com Com_Open(), mas veja que o nome correto da função é: Com_Init( nComPorta, nBaudRate, cParity, nDataLength, nStopBits ).
Coloquei um utilitário que uso para testar a leitura de peso de Balanças, e funciona com uma gama de balanças. Estude esse exemplo, e acho que ajudará você a entender um pouco o uso da HBCT.LIB, e se preferir usar HBRTL.LIB sugerida pelo Leonardo acho que é facil adaptar.
Porta serial no Harbour
Enviado: 11 Mai 2013 19:06
por Hasse
Boa noite Jairo.
Pelo que pude observar no teu exemplo, esta LIB funciona de forma um pouco diferente da "HBcom.lib" do xHarbour. Nesta se abre a porta com todas as informações de velocidade, paridade, etc.. Depois é só receber e enviar. Este diálogo evidentemente tem algumas exigências que o Aparelho remoto impõe.
Uso estas conexões via portas seriais para comunicação com Aparelhos Automáticos de Análises Clínicas, onde as comunicações são um pouco mais complicadas e exigentes, com diálogos entre as 2 portas.
Vou fazer os testes necessários, e em caso de dificuldades, volto ao assunto.
Antecipadamente te agradeço a gentileza.
Porta serial no Harbour
Enviado: 11 Mai 2013 21:50
por Hasse
Boa noite colegas, especialmente Jairo...
Realmente o problema principal era a versão do HMG.
Instalei uma mais recente, a Versão 3.1.1, que passou a aceitar as Funções da HBRTL.LIB.
Agora é se adaptar e aprender as sintaxes destas Funções, que funcionam de forma muito diferente daquela usada anteriormente.
Eu volto ao assunto.
\
Porta serial no Harbour
Enviado: 12 Mai 2013 12:00
por sygecom
Olá Hasse,
Eu já usei a HBCOM, mas tive diversos problemas com ela e passei a usar as funções da FIVE onde no link abaixo postei alguns exemplos de como capturar peso de balanças.
Mas se tiver usando com Harbour acho que são muito mais fáceis de usar, e compatíveis com as funções do Clipper
filebase.php?d=1&id=145&c_old=0&what=c&page=1
Porta serial no Harbour
Enviado: 14 Mai 2013 22:07
por Hasse
Boa noite colegas.
Pesquisando..., e as perguntas aumentando...
Há algumas versões que são divulgadas com uma numeração tipo 3.0.35, 3.0.46, 3.1.0, 3.1.1, etc., usando a IDE do Roberto Lopez, versão 2011.06.24.
Harbour versão 3.0.0.
Outra versão como 2.2.2, usando a IDE do Walter Formigoni, na versão 1.2.0, Harbour versão 3.2.0dev.
1)-Como funciona isto, meus amigos ?
2)-Posso usar a IDE do Roberto Lopez nos arquivos ..\SAMPLES\, da versão 2.2.2 ? Alguma restrição ?
3)-Eu gostei mais da IDE do Roberto Lopez. Qual a opinião dos amigos neste aspecto ?
Porta serial no Harbour
Enviado: 15 Mai 2013 14:06
por Jairo Maia
Olá Hasse,
Vou expor minha ainda parca experiência com a minigui:
IDE do Valter é a IDE que acompanha a MiniGui Extended. A IDE do Roberto, é um projeto independente, em pleno andamento de implementações, cujo fórum oficial é:
http://www.hmgforum.com/index.php
Sobre a IDE do Roberto, as versões a partir da 3.1.0 é orientada com a codificação UNICODE UTF-8.
Hasse escreveu:Posso usar a IDE do Roberto Lopez nos arquivos ..\SAMPLES\, da versão 2.2.2 ? Alguma restrição ?
Sim, tem restrição. Muitos exemplos possuem comandos não reconhecidos pela IDE do Roberto.
Hasse escreveu:Eu gostei mais da IDE do Roberto Lopez. Qual a opinião dos amigos neste aspecto ?
Eu particularmente tenho dificuldade em usar IDEs, porém, na minha humilde opinião a IDE do Roberto seria melhor, inclusive porquê tem uma comunidade grande usando e ajudando no desenvolvimento.
Porta serial no Harbour
Enviado: 16 Mai 2013 17:50
por Hasse
Boa noite.
Jairo: Obrigado pelas explicações. Muito válidas.
Fiz várias tentativas com abertura e inicialização da Porta Serial, sem sucesso. Abre mas não inicializa.
Testei a conexão com o Hiper Terminal e elas estão funcionando, nos 2 sentidos.
Estou anexando o código que pode ser testado:
Código: Selecionar todos
*
REQUEST HB_GT_WIN_DEFAULT // Janela DOS - Temporário, para testes.
*
#Define SOH Chr( 1 )
#Define STX Chr( 2 ) && Begin off text.
#Define ETX Chr( 3 ) && End off text.
#Define ETB Chr( 23 ) && Split too long text by Remote.
#Define ACK Chr( 6 )
#Define NACK Chr( 21 )
#Define CAN Chr( 24 )
#Define NOK Chr(127 )
#Define CRLF Chr( 13 ) + Chr( 10 )
*
MemVar COR_BX1, COR_BX2, MULTI
MemVar RS_MC1, RS_MC2, RS_MC3, RS_MC4, RS_MC5, RS_MC6, RS_MC7, RS_MC8
MemVar RS_MD1, RS_MD2, RS_MD3, RS_MD4, RS_MD5, RS_MD6, RS_MD7, RS_MD8
MemVar RS_OC1, RS_OD1, RS_OC2, RS_OD2, RG1
*
MemVar RS_COD, RS_NOM, RS_EXA, RS_SID, RS_SNM, RS_IDA
MemVar RS_DATREC, RS_DATCAD, RS_RES1, RS_TEXT
*
*
FUNCTION MAIN()
*
DBUseArea( .T. , , 'PRM_0', 'PRM', .T. ) // Arquivo dos parâmetros.
If NetErr()
Alert( 'Erro na Abertura do Arquivo - PRM_0.DBF' )
DBCloseAll()
Return (NIL)
EndIf
*
PRM->( DBGoTop() )
n_Port := 1 // ALLTRIM( STR( PRM->PRMCOM, 02, 00 ) )
n_Baud := 9600 // PRM->PRMBRT
n_DtBit := 8 // PRM->PRMDTB
n_Prty := 0 // PRM->PRMPRT
n_StpBt := 1 // PRM->PRMSTB
n_Size := 1024
n_Buff := 8000
*
lOpen := .F.
lWork := .F.
*
clear
? n_Port, "<=== Porta"
? n_Baud, "<=== Baud"
? n_DtBit, "<=== DataBit"
? n_Prty, "<=== Parity"
? n_StpBt, "<=== StopBit"
? n_Size, "<=== Size"
? n_Buff, "<=== Buffer"
l_Open := HB_COMOPEN( n_Port )
? l_Open, "<=== Open"
lWork := HB_COMINIT( n_Port, n_Baud, n_Prty, n_Size, n_StpBt )
? lWork, "<=== Init"
** l_Open := HB_COMOPEN( n_Port )
** ? l_Open, "<=== Open"
Pode-se observar que faço 2 testes: O primeiro com "HB_COMOPEN()" seguido do "HB_COMINIT()". O segundo, com as funções invertidas. Nos 2 casos a Porta não é inicializada. Sempre retorna .F.
Baseado nestes resultados é que penso que vou necessitar da Lista das Funções, com os parâmetros, tanto os necessários quanto os opcionais, se houver.
Algum colega pode me ajudar ? Um link onde consultar e/ou baixar.
Estou compilando com o Harbour 3.1.1 + Minigui (IDE do Roberto Lopez).
Não sei qual a LIB que o compilador acessa. Tem como verificar qual é ? Onde ?
Porta serial no Harbour
Enviado: 17 Mai 2013 06:30
por Jairo Maia
Olá Hasse,
Os comandos que você está usando são da HBRTL.LIB, mas não sei sobre documentação desta lib.
Não sei se este é o único problema, mas diferente da HBCOMM, a HBRTL e a HBCT usam caractere no parâmetro paridade, você está enviando numérico. Os valores de paridade podem ser: , N=(None), E=(Even), O=(Odd), M=(Mark), S=(Space) necessariamente maiúsculas.
HB_COMINIT( nPort, nBaud, cParity, nSize, nStop )
Velocidade, Data Bit e Stop bit também podem influenciar. Com qual equipamento você está tentando se comunicar?
Porta serial no Harbour
Enviado: 17 Mai 2013 08:27
por Hasse
Bom dia Jairo.
Acabei de testar com o Parity := "N" e também com "0" (caracter zero ), e a inicialização ainda continua com o mesmo resultado, "F".
A conexão é entre 2 computadores, sendo o remoto pertencente ou dedicado a um Aparelho Automático de Análises Clínicas, para Laboratórios de Análises Clínicas.
A Conexão Serial é a única forma de comunicação com ele. Eu penso que esta exigência dos fabricantes é para evitar a contaminação com vírus, pois todos eles permitem somente esta forma de acesso e comunicação.