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
