Página 3 de 3

Porta serial no Harbour

Enviado: 08 Ago 2013 20:36
por sygecom
Hasse,
Relendo o topico, eu percebi que está usando Harbour e nem todas as funções da CA-TOOLS foi para o Harbour, pode pegar as funções migradas da CA-TOOLS para o Harbour cno ChangeLog do Harbour:
https://raw.github.com/harbour/core/mas ... ngeLog.txt

Porta serial no Harbour

Enviado: 09 Ago 2013 09:33
por Hasse
Bom dia Leonardo.

Realmente estou compilando com o Harbour 3.1.4, com HBCT.lib.

Estou muito satisfeito pois o aplicativo está funcionando muito bem.

Tive dificuldades na conexão serial com um aparelho de análises. No início pensei que a LIB fosse a culpada. Acabei por descobrir que a "culpa" era do aparelho, que é muito exigente. Ele requer que um ACK seja disparado imediatamente após o término de transmissão de uma linha. Qualquer atraso gera um erro.

De qualquer forma agradeço a tua sempre fraterna atenção e gentileza.

Esta foi minha primeira incursão na programação MiniGui. Preciso aprender muito ainda.

Um detalhe que eu gostaria de contornar é o seguinte:
-Para que o aplicativo esteja sempre atualizado uso um BAT para copiar o executável do Servidor para o terminal local.
CD \HBCom
COPY \Server\Apps\HBComZ1.exe
HBComZ1
-Um janela console se abre e permanece aberta até o encerramento do aplicativo HBComZ1.
-Eu já ensinei que a janela pode ser encerrada, mas os operadores nem sempre o fazem.

Existe alguma forma de "fechar" esta janela automaticamente ?

Porta serial no Harbour

Enviado: 09 Ago 2013 10:59
por rochinha
Amiguinho,

Voce está executando o mesmo através de arquivo de lote?

Se o programa é executado apenas para fazer uma operação e não necessita ficar ativo, force dentro dele para se fechar.

O fato de se usar arquivo de lote é prender ela pelos comandos executados dentro do lote.

Ao invés de usar este lote crie outro que execute os comandos assim:

Código: Selecionar todos

cmd.exe CD \HBCom
cmd.exe COPY \Server\Apps\HBComZ1.exe
cmd.exe HBComZ1
Tente e veja se ainda assim melhora.

Porta serial no Harbour

Enviado: 09 Ago 2013 18:23
por Jairo Maia
Olá Hasse,
Hasse escreveu:Para que o aplicativo esteja sempre atualizado uso um BAT para copiar o executável do Servidor para o terminal local.
Você faz isso a cada vez que abre o sistema no terminal? Ou não entendi nada?

Se for o que entendi, você pode pelo seu aplicativo verificar a data e hora de criação do arquivo no servidor, comparar com o arquivo local, tudo isso em frações de segundos, e se forem diferentes da máquina local, então você avisa o usuário que vai sincronizar as versões, e chama o bat de atualização abortando seu sistema.

Porta serial no Harbour

Enviado: 04 Mai 2015 21:01
por janio
Jairo,

Estou precisando muuuuito fazer a leitura do peso de uma balança toledo prix III plus. Peguei o seu exemplo, compilei, mas tem mim retornado sempre ERRO NA LEITURA DO PESO!

Conforme o manual, as configurações de porta para essa balança devem ser: 4800 baud, 8 bit de dados, sem paridade e 1 stop bit.

Coloquei exatamente dessa forma mas NAO FUNCIONOU! Detalhe: tenho um utilitario aqui do acbr para leitura de balanças e com ele consigo pegar o peso.

Estou fazendo algo errado??

(nao queria depender do acbr para ler peso dessa balança)

Porta serial no Harbour

Enviado: 04 Mai 2015 23:45
por Nascimento
bom nao conheço bem digamos esse tipo de balança mais digamos que vc bote 1kg ela retorna alguma string que equivala ao peso nao?

se for seguindo essa ideia , vc coloca 1kg e v o retorno que dá cria uma tabela e acho que dará certo, posso ta falando bobagem mais é pelo que digamos imaginei

Porta serial no Harbour

Enviado: 05 Mai 2015 08:28
por janio
Jairo,

Nunca trabalhei com COMUNICAÇÃO DIRETA com portas seriais.

O manual da balança diz:

Obtendo o peso da balança:
[ENQ]

Vc envia o codigo "05" para obter o peso da balança... não entendi!

Janio

Porta serial no Harbour

Enviado: 05 Mai 2015 09:17
por Hasse
Bom dia

Não conheço as exigências da citada balança, mas há algumas regras que a "maioria" das comunicações seriais usa.

1)-Abrir a Porta Serial.

2)-Início da comunicação:

Código: Selecionar todos

OutBufClr( nHandle )                    && Limpa o Buffer de Saída da porta serial
OutChr( nHandle, ACK )                  && Envia um Ack (06) para o aparelho remoto.
3)-Veja no manual se o [ENQ] não necessita de um comando que precede esta instrução. Tipo [STX] + [ENQ], onde
STX é CHR(2)

4)-Para você receber o retorno de uma serial você precisa criar uma variável para receber esta informação, tipo:

Código: Selecionar todos

nRead := InBufSize( nHandle )                      && Lê o tamanho da string a ser recebida.
cRead := Space( nRead )                            && Cria a variável no tamanho correto.
InChr( nHandle, nRead, @cRead)                     && Arquiva a leitura na variável cRead
A partir deste ponto você pode ler e manipular o resultado que veio da balança, lembrando que todas as comunicação seriais são em modo texto puro.

A porta serial é uma forma de comunicação muita antiga, e por isso eu a chamo de "burra", ou seja, via programação, você precisa dizer exatamente o que você deseja, e seguindo estritamente as exigências impostas pelo fabricante.
Como exemplo cito: Alguns fabricantes exigem que, após recebido o retorno da informação solicitada, é necessário que se retorne o equivalente ao "recebido corretamente" ou "não recebido corretamente". Isto é feito com os valores [ACK] -> chr(6) e [NAK] -> chr(21) respectivamente. Caso isto não seja feito, o aparelho remoto entra em "erro".

Porta serial no Harbour

Enviado: 05 Mai 2015 09:23
por janio
Hasse,

Não sei se vc viu o codigo-exemplo disponibilizado pelo Jairo. Os códigos de comunicação que ele usa são um pouco diferentes dos postados por vc, talvez por ele utilizar outra lib.

Mas assim... ele disponibilizou um codigo e dizendo ele que consegue obter o peso de varios modelos de balanças toledo com esse codigo.

Não estou conseguindo sucesso com o mesmo codigo e gostaria de saber o pq.

Janio

Porta serial no Harbour

Enviado: 05 Mai 2015 10:03
por Hasse
Certamente, meu caro colega, existem várias lib's para comunicação serial, mas a forma de comunicação segue mais ou menos a mesma filosofia.
Os comando e função podem diferir em seus nomes, mas os parâmetros é que são importantes.

Como não trabalho com balanças, não posso te ajudar neste aspecto. Neste momento, credito que o Jairo seria o colega indicado para te ajudar.

Porta serial no Harbour

Enviado: 05 Mai 2015 10:35
por Jairo Maia
Olá Jânio,

Este é o protocolo para essa balança.

ENQ é o caracter 5 na tabela ASCII, e note que não é string, mas sim numérico. Se no exemplo você colocou entre aspas não funciona.

Qual exemplo você baixou? Tem como postar o link? Isso porque já publiquei mais de um, e gostaria de ver se o exemplo pode ter algum problema.

Porta serial no Harbour

Enviado: 05 Mai 2015 10:42
por janio
Ola Jairo,

Baixei o que vc postou aqui mesmo neste topico. Ta primeira página (TESTEBAL.ZIP).
https://pctoledo.org/forum/viewto ... 45&t=14136

Janio

Porta serial no Harbour

Enviado: 05 Mai 2015 14:35
por Jairo Maia
Jânio,

Compile esse exemplo e tente com ele. Acho que quando subi o arquivo subi o que não estava testado e ele tem erro.

A Prix III Ligth sei que é 4800, mas como a sua é Plus, tente também com outras velocidades. Este é o que uso para testes de protocolos:

Código: Selecionar todos

/*

  Le peso de vßrias balanþas usando a HBCT.LIB

  Compilar: HBMK2 Nome_Exemplo -lhbct

*/

#include "inkey.ch"
#include "hbgtinfo.ch"

REQUEST HB_GT_WVT_DEFAULT

FuncTion Main()

  HB_GtInfo( HB_GTI_FONTNAME, "Lucida Console" )
  HB_GtInfo( HB_GTI_FONTSIZE, 26 )
  HB_GtInfo( HB_GTI_FONTWIDTH, 12 )

  SetColor( "GR+/N" )

  Private nPesoLido := 0.000
  Private nBal_ComPorta := 1
  Private nBal_BaudRate := 9600  // 300, 600, 1200, 2400, 4800, 9600, 19200
  Private cBal_Parity := "N"     // (E)ven, (O)dd, (M)ark, (S)pace, (N)one
  Private nBal_DataLength := 8   // 7, 8
  Private nBal_StopBits := 2     // 1, 2
  Private nBal_String := 5       // Caracter ASCII para Iniciar transmissao
  Private nBal_BytesReturn := 20 // Bytes de retorno

  Do While .T.

    Clear Screen

    @ 06, 22 Say "Porta.................: " Get nBal_ComPorta Pict "9"
    @ 08, 22 Say "Velocidade............: " Get nBal_BaudRate Pict "99999"
    @ 10, 22 Say "Paridade..............: " Get cBal_Parity Pict "!"
    @ 12, 22 Say "Comprimento de Dados..: " Get nBal_DataLength Pict "9"
    @ 14, 22 Say "Bits de Parada........: " Get nBal_StopBits Pict "9"
    @ 16, 22 Say "Caractere de Leitura..: " Get nBal_String Pict "999"
    @ 18, 22 Say "Bytes de Retorno......: " Get nBal_BytesReturn Pict "999"
    Read

    If LastKey()=K_ESC
      Exit
    Endi
	
    Clear Screen

    While LastKey() != K_ESC
      
      Set Key K_F2 To PegarPeso()
      @ 10, 23 Say "Pressione F2 para capturar o Peso"
      @ 12, 23 Say "Peso..: " Get nPesoLido
      @ 14, 23 Say "Pressione ESC para Sair"
      Read
    EndDo

  EndDo

Return Nil

Function PegarPeso()
  Local cLeitura
  Local nInicioPeso
  Local nTempo := 0
  Local lFalhouLeitura := .F.

  nPesoLido := 0

  If Com_Open( nBal_ComPorta, 1024, 1024) == .F.
    Alert( "Erro na abertura da Porta!" )
    Return ( nPesoLido )
  EndIf

  Com_Init( nBal_ComPorta, nBal_BaudRate, cBal_Parity, nBal_DataLength, nBal_StopBits )

  Com_Send( nBal_ComPorta, Chr( nBal_String ) )

  /* 
     Evita loop permanente por falha na leitura
  */
  While Com_Count( nBal_ComPorta ) < 7
   InKey( 0.1 )
   If ++nTempo = 5
    lFalhouLeitura := .T.
    Exit
   Endi
  EndDo

  If !lFalhouLeitura

    cLeitura := Com_Read( nBal_ComPorta )
    MemoWrit("PesoLido.txt", cLeitura )

    nInicioPeso := At( Chr( 2 ), cLeitura )
    If nInicioPeso > 0
      nPesoLido := ( Val( Subs( cLeitura, nInicioPeso + 1, 5 ) ) / 1000 )
    EndIf

  EndIf
  
  Com_Close( nBal_ComPorta )

  If nPesoLido > 0
    M->nPesoLido := nPesoLido
  Else
    Hb_Alert( "Erro na Leitura do Peso!" )
  Endif

Return ( nPesoLido )

Porta serial no Harbour

Enviado: 05 Mai 2015 14:40
por janio
Obrigado, Jairo!

Vou olhar! A Plus eh 4800 também.

Janio

PS: Esse eh o manual da balança

Porta serial no Harbour

Enviado: 05 Mai 2015 17:04
por janio
Jairo, PERFEITO!

Funcionou de primeira! MUITO OBRIGADO!

Unica coisa q mudei foi q coloquei a velocidade 4800 e StopBits para 1

Janio