PC SOFT
DEPOT EN LIGNE
POUR WINDEVWEBDEV ET WINDEV MOBILE

Porta Serial - Leitura e escrita em Porta Serial COM ou Paralela usando Maquina de Estado com Thread intermitente
Publié par Boller
- Non classée
Nouveautés
MAIS INFORMAÇÕES
Adriano José Boller
Consultor, Representante Oficial PC SOFT
Email: adrianoboller@gmail.com
Telefone: +55 (41) 99949-1800
Skype: adrianoboller
Horário: Segunda—sexta: 8h–18h
Sábados & domingos: 11h–15h

Description
Porta Serial V3

Posté le 21 décembre 2015 - 12:28
Wx - Código Exemplo de Leitura do Peso da Balança Filizola e Toledo para Supermercados, Padarias e Restaurantes
// Balança de peso fixo: é a balança que somente disponibiliza o buffer quando o peso está estabilizado. por exemplo, //Toledo 9094.
// Balança de peso variável: é a balança que apresenta o peso enquanto o mesmo não está estabilizado mas disponibiliza //a leitura do buffer mesmo assim. por exemplo, Filizola BP-15


// Fixed weight scale: the scale that only provides the buffer when the weight is stabilized. for example, Toledo 9094.
// Variable weight scale: the scale that shows the weight while it is not stabilized but available reading buffer anyway. for //example, Filizola BP-15


// Échelle de poids fixe: l'échelle qui ne fournit que la mémoire tampon lorsque le poids est stabilisé. par exemple, de //Toledo 9094.
// Échelle de poids variable: l'échelle qui montre le poids alors qu'il ne se stabilise pas, mais disponible tampon de lecture //de toute façon. Par exemple, Filizola BP-15

CODE:

bufM_peso_lido_com is Buffer
// é necessário que a varável que receberá o retorno seja do tipo buffer

rM_peso_lido_com_tratado is real = 0

sM_peso_lido_verifica_1 is string = "" // armazena o valor da primeira leitura
sM_peso_lido_verifica_2 is string = "" // armazena o valor da segunda leitura
sM_peso_lido_verifica_3 is string = "" // armazena o valor da terceira leitura

bM_peso_lido_verifica_erro is boolean = False
nM_peso_lido_verifica_leitura is int = 0

sClose(gnPar_ParTermBalancaPorta)
// apenas por segurança força o fechamento da porta caso tenha sido aberta - gnPar_ParTermBalancaPorta contem número da porta: 1(com1) 2(com2) 3(com3) ...
Wait(5)
// é necessário aguardar para evitar atropelamento no próximo comando para a porta serial

VERIFICA_3_LEITURAS:
// em caso de balança com peso variável faço 3 lleituras para evitar uma possível leitura errada enquanto o peso não está estabailizado
IF sOpen(gnPar_ParTermBalancaPorta,1,16) THEN // abrindo a porta serial
Wait(gnPar_ParTermBalancaTimeOut)
// timeout para evitar atropelamento no próximo comando para a porta serial. tenho isso como parâmetro para cada terminal pois pode variar de balança para balança

IF sParameter(gnPar_ParTermBalancaPorta,gnPar_ParTermBalancaParametroBaudeRate,gnPar_ParTermBalancaParametroParity,gnpar_ParTermBalancaParametroDataBits,gnpar_ParTermBalancaParametroStopBits,gnPar_ParTermBalancaParametroDtrDsr) = True THEN
// parâmetros de configuração
Wait(gnPar_ParTermBalancaTimeOut)
// timeout para evitar atropelamento no próximo comando para a porta serial. tenho isso como parâmetro para cada terminal pois pode variar de balança para balança

IF sWrite(gnPar_ParTermBalancaPorta,Charact(5)) = True THEN // o caracter decimal 5 é o compreendido com o requisição
Wait(gnPar_ParTermBalancaTimeOut)
// timeout para evitar atropelamento no próximo comando para a porta serial. tenho isso como parâmetro para cada terminal pois pode variar de balança para balança

bufM_peso_lido_com = sRead(gnPar_ParTermBalancaPorta,16) // faz a leitura do buffer da porta

sClose(gnPar_ParTermBalancaPorta) // fecha a porta para uma próxima leitura, se necessário **** vide comentários no fim da rotina

IF NoSpace(bufM_peso_lido_com) <> "" THEN
bufM_peso_lido_com = Middle(bufM_peso_lido_com,gnPar_ParTermBalancaParametroRetornoPosIni,gnPar_ParTermBalancaParametroRetornoDigitosdoPeso)
//gnPar_ParTermBalancaParametroRetornoPosIni - parâmetros onde indica em qual posição começa a informação do peso, na leitura do buffer
//gnPar_ParTermBalancaParametroRetornoDigitosdoPeso - parâmetros onde indica em qual posição termina a informação do peso, na leitura do buffer
rM_peso_lido_com_tratado = Val(bufM_peso_lido_com) / 1000

IF gsPar_ParTermBalancaTipoRetorno = "C" THEN // parãmetro que indica quando a balança possui peso do tipo varíavel **** vide comentários no fim da rotina
GOTO FIM
// finaliza a rotina pois balanças de peso constante somente liberam o buffer após o peso estar estabilizado
END

IF gsPar_ParTermBalancaTipoRetorno = "V" THEN // parãmetro que indica quando a balança possui peso do tipo varíavel **** vide comentários no fim da rotina
nM_peso_lido_verifica_leitura++

IF nM_peso_lido_verifica_leitura = 3 THEN
IF sM_peso_lido_verifica_1 <> sM_peso_lido_verifica_2 OR sM_peso_lido_verifica_1 <> sM_peso_lido_verifica_3 THEN
bM_peso_lido_verifica_erro = True
END
IF sM_peso_lido_verifica_2 <> sM_peso_lido_verifica_1 OR sM_peso_lido_verifica_2 <> sM_peso_lido_verifica_3 THEN
bM_peso_lido_verifica_erro = True
END
IF sM_peso_lido_verifica_3 <> sM_peso_lido_verifica_1 OR sM_peso_lido_verifica_3 <> sM_peso_lido_verifica_2 THEN
bM_peso_lido_verifica_erro = True
END

IF bM_peso_lido_verifica_erro THEN
rM_peso_lido_com_tratado = 0
Error("É Necessário Que o Peso Esteja Estabilzado!")
END
ELSE
GOTO VERIFICA_3_LEITURAS
END
END
ELSE
Error("Não Foi Possível Obter o Retorno da Porta COM")
END
ELSE
Error("Não foi Possível Enviar o Comando à Porta COM.")
END
ELSE
Error("Parâmetros Inválidos Para a Porta COM.")
END
ELSE
IF p_avisa_erro_porta_com THEN
Error("Porta COM Não Acessível!")
END
END

FIM:

sClose(gnPar_ParTermBalancaPorta) // fecha a porta de comunicação


Código fornecido para a comunidade pelo:

Sr Mário José Nogueira de Oliveira
Mais novo Consultor da Plataforma PC SOFT

Empresa Assist Informática
Rua Coronel Pires Barbosa, 846
Campo do Galvão - Guaratinguetá-SP - 12.505-020
Email: mario-oliveira-br@uol.com.br
Skype: mario-guara

55 (12) 9 9778-0262
55 (12) 9 9794-7010
55 (12) 3126-1465

Bons projetos e bons estudos...


Procedure DefinePorta()

IF COMBO_Tipo_da_Porta = 1
EDT_Número_da_Porta = EDT_Número_da_Porta
NomeNumeroPorta = "COM"+EDT_Número_da_Porta
ELSE IF COMBO_Tipo_da_Porta = 2
EDT_Número_da_Porta = EDT_Número_da_Porta * -1
NomeNumeroPorta = "LPT"+EDT_Número_da_Porta
ELSE IF COMBO_Tipo_da_Porta = 3
IF Middle(EDT_Número_da_Porta,1,1) = "-"
EDT_Número_da_Porta = Middle(EDT_Número_da_Porta,2,10)
NomeNumeroPorta = "IR"+EDT_Número_da_Porta
END
END



// Opening port SERIAL, PARALELA OU INFRAVERMELHA
nPort = 0

nPort = sOpen(EDT_Número_da_Porta,EDT_Tamanho_Buffer_de_input_em_bytes,EDT_Tamanho_Buffer_de_output_em_bytes,EDT_Timeout_de_leitura_da_porta_em_segundos,True)

IF ErrorOccurred THEN

ToastDisplay("Não foi possivel abrir a porta, Erro: "+ErrorInfo() +" - "+ Error(),toastLong,vaMiddle,haCenter)

StatusPorta = False

ELSE

ToastDisplay("Porta "+ nPort +" Aberta com sucesso!",toastLong,vaMiddle,haCenter)

StatusPorta = True

IF StatusPorta = True AND nPort > 0

DTRDSR, RTSCTS is int = 0

IF CBOX_DTRDSR = False THEN
DTRDSR = 0
ELSE
DTRDSR = 1
IF CBOX_DTRDSR_INATIVO = True THEN
DTRDSR = 2
END
END

IF CBOX_RTSCTS = False THEN
RTSCTS = 0
ELSE
RTSCTS = 1
IF CBOX_RTSCTS_INATIVO = True THEN
RTSCTS = 2
END
END

bResultado is boolean = sParameter(nPort, EDT_Rate_Bauds,EDT_Parity,EDT_Data_Bits,EDT_Number_of_Stop_Bits,DTRDSR,RTSCTS,CBOX_XONXOFF)

IF bResultado = True THEN

ToastDisplay("Porta inicializada e configurada com sucesso!",toastLong,vaMiddle,haCenter)

IF StatusPorta = True AND nPort > 0 THEN

BufferRead = ""

BufferRead = sRead(EDT_Número_da_Porta,EDT_Tamanho_Buffer_de_input_em_bytes)

IF BufferRead <> "" THEN

EDT_Resultado = BufferRead

ToastDisplay("Leitura da Porta realizada com Sucesso!",toastLong,vaMiddle,haCenter)

IF StatusPorta = True AND nPort > 0 THEN

sClose(EDT_Número_da_Porta)

SetFocus(EDT_Resultado)

ELSE

ToastDisplay("Não foi inicializada e nem configurada nenhuma porta!",toastLong,vaMiddle,haCenter)

END

ELSE

ToastDisplay("Não veio nenhum valor da porta",toastLong,vaMiddle,haCenter)

END

ELSE

ToastDisplay("ERRO: Não é possivel ler a porta se não estiver configurada corretamente!",toastLong,vaMiddle,haCenter)

END

ELSE

ToastDisplay("ERRO A PORTA NÃO FOI CONFIGURADA CORRETAMENTE",toastLong,vaMiddle,haCenter)

END

END

END




//Abrir a porta
// Opening port SERIAL, PARALELA OU INFRAVERMELHA
nPort = 0

IF EDT_Timeout_de_leitura_da_porta_em_segundos > 0

nPort = sOpen(EDT_Número_da_Porta,EDT_Tamanho_Buffer_de_input_em_bytes,EDT_Tamanho_Buffer_de_output_em_bytes,EDT_Timeout_de_leitura_da_porta_em_segundos,True)

ELSE

nPort = sOpen(EDT_Número_da_Porta,EDT_Tamanho_Buffer_de_input_em_bytes,EDT_Tamanho_Buffer_de_output_em_bytes)

END

IF ErrorOccurred THEN

Info("Não foi possivel abrir a porta, Erro: "+ErrorInfo() +" - "+ Error())
StatusPorta = False

ELSE

Info("Porta "+ nPort +" Aberta com sucesso!")
StatusPorta = True

END




//Configurar a porta
// Open COM1
IF StatusPorta = True AND nPort > 0 THEN

DTRDSR, RTSCTS is int = 0

IF CBOX_DTRDSR = False THEN
DTRDSR = 0
ELSE
DTRDSR = 1
IF CBOX_DTRDSR_INATIVO = True THEN
DTRDSR = 2
END
END

IF CBOX_RTSCTS = False THEN
RTSCTS = 0
ELSE
RTSCTS = 1
IF CBOX_RTSCTS_INATIVO = True THEN
RTSCTS = 2
END
END

bResultado is boolean = sParameter(nPort, EDT_Rate_Bauds,EDT_Parity,EDT_Data_Bits,EDT_Number_of_Stop_Bits,DTRDSR,RTSCTS,CBOX_XONXOFF)


IF bResultado = True THEN

Info("Porta inicializada e configurada com sucesso!")

ELSE

Info("ERRO A PORTA NÃO FOI CONFIGURADA CORRETAMENTE")

END

END




//Ler a porta
IF StatusPorta = True AND nPort > 0 THEN

BufferRead = ""

BufferRead = sRead(EDT_Número_da_Porta,EDT_Tamanho_Buffer_de_input_em_bytes)

IF BufferRead <> "" THEN

EDT_Resultado = BufferRead

SetFocus(EDT_Resultado)

Info("Leitura da Porta realizada com Sucesso!")

ELSE

Info("Não veio nenhum valor da porta")

END

ELSE

Info("ERRO: Não é possivel ler a porta se não estiver configurada corretamente!")

END




//Verificar eventos da porta
IF StatusPorta = True AND nPort > 0 THEN

// Detect characters on the port
sEvent(nPort, sEveCharReceived, "Read")
sEvent(nPort, sEveCharReceived , "ReadCharacter" )
sEvent(nPort, sEveBreak, "Break")
sEndEvent(nPort, sEveBreak)

Trace(sRead(nPort, sInEntryQueue(1)))

ELSE

Info("ERRO: Não é possivel ler a porta se não estiver configurada corretamente!")

END




//Fechar Porta
IF StatusPorta = True AND nPort > 0 THEN

sClose(EDT_Número_da_Porta)

ELSE

Info("Não foi inicializada e nem configurada nenhuma porta!")

END


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PC SOFT no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Illustrations, copies d'écran
none
none
Avis des utilisateurs
(Pour noter la ressource, cliquez sur Ecrire un avis)
Boller
glo_ler_tabcfglocal()
sRetorno is string
rValor is real
Porta is 8-byte int=CommandLine(1)[[1]]

IF NOT sOpen(tabcfglocal.tabcfglocal_balanca_porta,10,1,sDefaultTimeout) THEN
RESULT(0)
END
sParameter(tabcfglocal.tabcfglocal_balanca_porta,tabcfglocal.tabcfglocal_balanca_rate,tabcfglocal.tabcfglocal_balanca_paridade,tabcfglocal.tabcfglocal_balanca_nbdatabits,tabcfglocal.tabcfglocal_balanca_nbstopbits)
nGnResultado is 8-byte int=sWrite(Porta,Charact(5))
Multitask(50)
sRetorno=sRead(tabcfglocal.tabcfglocal_balanca_porta,10)[[2 TO 6]]
sClose(Porta)
RESULT(sRetorno)

O comando sWrite pode enviar um caracter ascii 5 para solicitar o peso para ser lido pelo sRead

Mas lembro tem que ler o manual da balança para ver os parâmetros de configuração

Dica do Paulo Viana