Abrir, ler, gravar porta serial com HBComm, CCD, balanca, EC

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
dbsh
Usuário Nível 3
Usuário Nível 3
Mensagens: 128
Registrado em: 14 Jul 2004 14:19
Localização: ES

Abrir, ler, gravar porta serial com HBComm, CCD, balanca, EC

Mensagem por dbsh »

segue pequeno exemplo de como usar HBComm.lib

chamar:
EXECUTAVEL porta [velocidade] [dados] [paridade] [stop] buffer] [testar]
ABRECOMM COM1 9600 8 N 1 8000 /T

todos parametros sao opcionais, menos porta
Porta podera ser:
um handle de uma porta ja aberta
o numero da porta
uma expressao caracter com o numero da porta

Código: Selecionar todos

#define TESTE

/*
linkar com a lib HBComm
*/

#command DEFAULT <var> TO <def> [, <varn> TO <defn>]     =>  ;
         <var> := if(<var> = nil,<def>,<var>) [; <varn> := if(<varn> = nil,<defn>,<varn>)]

//abrecomm.ch
#define COM_READ_TIMEOUT 300
#define COM_READ_RETRY     5

#define COM_SEND_TIMEOUT 300
#define COM_SEND_RETRY     5

#DEFINE COM_ERRO_PORTA_NO_DEF     1 //porta nao foi definida
#DEFINE COM_ERRO_PORTA_FECHADA    2 //porta fechada
#DEFINE COM_ERRO_PORTA_INVALIDA   3 //porta invalida
#DEFINE COM_ERRO_PORTA_ABRIR      8 //nao foi possivel abrir porta

#DEFINE COM_ERRO_HANDLE_INVALIDO 16 //handle passado invalido

#DEFINE COM_ERRO_SEND            32 //erro ao enviar dados para comm

#DEFINE COM_ERRO_READ            64 //erro ao ler dados na comm

#DEFINE COM_ERRO_LEN             64 //total

STATIC lMsDos := .F., nErro := 0, cErro := "", cErroDos := ""

#IFDEF TESTE
//ANNOUNCE HB_NOSTARTUPWINDOW
Function Teste( cPorta, nBaud, nData, nParity, nStop, nBufferSize, cOp )

LOCAL nHandle := 0, CodBar, xx, uOk := 0

DEFA cOp TO ""

//HBConfigTela()

nHandle := AbrePortaSerial( cPorta, nBaud, nData, nParity, nStop, nBufferSize )
IF nErro <> 0
    ErrorLevel(nErro)
    ? cErro
ENDIF

IF !IsWorking( nHandle )
    RETU nHandle
ENDIF

cOp := Upper( cOp )

IF cOp = "/T"
    ? "Passe o codigo no leitor de codigo de barra ou coloque o peso na balanca"
    wait "pressione enter"
    ?
ENDIF

//teste de gravacao solicita dados balanca
IF cOp = "/T"
    GravarPortaSerial( Chr( 5 ) )
ENDIF

//teste de leitura CCD e balanca
IF cOp = "/T"
    ? LerPortaSerial( nHandle )
ENDIF

FechaPortaSerial( nHandle )

IF cOp = "/T"
    wait "pressione enter para sair"
ENDIF

RETU nErro

RETU .T.
#ENDIF

FUNCTION AbrePortaSerial( uPorta, nBaud, nData, uParity, nStop, nBufSize )
LOCAL aRet, TimeOut, nHandle, cPorta, nParity, cRet

nErro := 0
cErro := ""
cErroDos := ""

dele file ( "abrecomm.txt" )

IF uPorta = NIL
    nErro := COM_ERRO_PORTA_NO_DEF
    cErro := "Erro porta serial nao definida"
    cErroDos += "&" + StrTrim(nErro) + "=" + cErro
    RETU nErro
ENDIF

IF ValType(uPorta) = "N"
    IF uPorta >= 256
        IF !IsWorking( uPorta )
            nErro := COM_ERRO_PORTA_FECHADA
            cErro := "Erro handle invalido " + StrTrim(uPorta)
            cErroDos += "&" + StrTrim(nErro) + "=" + cErro
            RETU nErro
        ENDIF
        RETU uPorta
    ELSE
        cPorta := "COM" + StrTrim(uPorta)
    ENDIF
ELSEIF ValType(uPorta) = "C"
    IF Upper(Left(uPorta, 3)) = "COM"
        cPorta := uPorta
    ELSE
        cPorta := "COM" + uPorta
    ENDIF
ELSE
    nErro := COM_ERRO_PORTA_INVALIDA
    cErro := "Erro porta invalida"
    cErroDos += "&" + StrTrim(nErro) + "=" + cErro
    RETU nErro
ENDIF

cPorta := Upper(cPorta)

IF cPorta = "COM/?" ;
    .or. cPorta = "COM?" ;
    .or. cPorta = "COM/HELP" ;
    .or. cPorta = "COM/AJUDA"
    ? "uPorta nBaud nData cParity nStop nBufferSize"
    ? "COM2   [9600] [8]  [N]     [1]   [8000]"
    nErro := 0
    cErro := ""
    cErroDos := ""
    RETU 0
ENDIF

DEFA nBaud TO 9600
IF ValType( nBaud ) = "C"
    nBaud := Val( nBaud )
ENDIF

DEFA uParity TO "N"
IF ValType( uParity ) = "C"
    nParity := At(Upper(uParity), "OME") //N = 0, e padrao
ELSE
    nParity := uParity
ENDIF

DEFA nData TO 8
IF ValType( nData ) = "C"
    nData := Val( nData )
ENDIF

DEFA nStop TO 1
IF ValType( nStop ) = "C"
    nStop := Val( nStop )
ENDIF

DEFA nBufSize TO 8000
IF ValType( nBufSize ) = "C"
    nBufSize := Val( nBufSize )
ENDIF

/*
cRet := cPorta + ":" + StrTrim(nBaud) + "," ;
        + SubStr("NOME", nParity + 1, 1) + "," ;
        + StrTrim(nData) + "," ;
        + StrTrim(nStop) ;
        + " BUFFER:" + StrTrim(nBufSize)
MemoWrit(PathDefLocal() + "abrecomm." + cPorta, cRet)
*/

//retorna Handler >= 256 se abriu a porta
nHandle := Init_Port( cPorta, nBaud, nData, nParity, nStop, nBufSize )

IF !IsWorking( nHandle )
    nErro := COM_ERRO_PORTA_ABRIR
    cErro := "Erro ao Abrir porta serial;" ;
        + cErro ;
        + ";ERRO:" + StrTrim(nHandle)
    cErroDos += "&" + StrTrim(nErro) + "=" + cErro
    RETU nErro
ENDIF

RETU nHandle

FUNCTION FechaPortaSerial( nHandle )
RETU UnInt_Port( nHandle )

FUNCTION LerPortaSerial( nHandle, nRead, nTimeOut, nRetry )
LOCAL cRet := ""

DEFA nTimeOut TO COM_READ_TIMEOUT
DEFA nRetry TO COM_READ_RETRY

nErro := 0
cErro := ""
cErroDos := ""

nHandle := AbrePortaSerial( nHandle )
IF !IsWorking( nHandle )
    RETU ""
ENDIF

cRet := ""
nRead := 0

WHIL nRetry > 0
    IF inBufSize( nHandle ) < 1
        Millisec( nTimeOut )
        nRetry --
        LOOP
    ENDIF
    cRet += InBufCls( nHandle )
    //nRetry := COM_READ_RETRY
   EXIT
ENDDO

nRead := Len(cRet)

RETU cRet

FUNCTION GravarPortaSerial( nHandle, cWrite, nTimeOut, nRetry )

DEFA nTimeOut TO COM_SEND_TIMEOUT
DEFA nRetry TO COM_SEND_RETRY

nErro := 0
cErro := ""
cErroDos := ""

nHandle := AbrePortaSerial( nHandle )
IF !IsWorking( nHandle )
    RETU nErro
ENDIF

nErro := COM_ERRO_SEND
cErro := "Erro ao gravar na porta " + StrTrim(nHandle)
cErroDos += "&" + StrTrim(nErro) + "=" + cErro

IF nRetry < 0
    nRetry := 0
ENDIF

IF OutBufSize( nHandle ) <> 0
    IF !OutBufClr( nHandle )
        RETU nErro
    ENDIF
ENDIF

WHIL nRetry >= 0
    IF OutChr( nHandle, @cWrite, Len(cWrite) )
        nErro := 0
        cErro := ""
        cErroDos := ""
        EXIT
    ENDIF
    Millisec( nTimeOut )
    nRetry --
ENDDO

IF nErro <> 0
    RETU nErro
ENDIF

IF nRetry < 0
    nRetry := 0
ENDIF

nErro := COM_ERRO_SEND
cErro := "Erro ao gravar na porta " + StrTrim(nHandle)
cErroDos += "&" + StrTrim(nErro) + "=" + cErro

WHIL nRetry >= 0
    IF OutBufSize( nHandle ) = 0
        nErro := 0
        cErro := ""
        cErroDos := ""
        EXIT
    ENDIF
    Millisec( nTimeOut )
    nRetry --
ENDDO

RETU nErro

FUNCTION InBufCls( nHandle )
LOCAL nRead, cRead, cRet := ""

WHIL inBufSize( nHandle ) > 0
    nRead := InBufSize(nHandle)
    cRead := Space(nRead)
    InChr( nHandle, nRead, @cRead)
    cRet += cRead
ENDDO

RETU cRet
010011110010000001110011011101010110001101100101011100110111001101101111001000001110100100100000011000110110111101101110011100110111010001110010011101011110110101100100011011110010000001100001001000000110111001101111011010010111010001100101
01001101011000010111001001100011011011110111001100100000010000010110111001110100011011110110111001101001011011110010000001000100011001010010000001000010011011110110111001101001
0101010001100101011011000011101000100000001010000011001000110111001010010011100100101101001110010011100000110100001100110010110100110101001100100011100100110000
Responder