Comunicação direta com HbComm

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

Comunicação direta com HbComm

Mensagem por leandrolinauer »

Bom dia caros colegas.
:))
Estive fazendo comunicação direta com a impressora da bematech mp 2100 th fi e consegui até pegar o retorno de um numero de cupom fiscal, mas no entanto não consegui desifrar a conversão dele para o sistema entender, se alguém puder me esclarecer o que devo fazer e como fazer fico grato.
Exemplo:
Comando abaixo busca o ultimo cupom fiscal que no meu caso seria o COO 000019

Código: Selecionar todos

cCmd :=chr(2)+chr(4)+chr(0)+chr(27)+chr(30)+chr(57)+chr(0) 
nPorta:=Init_Port(wECF_Porta,9600,8,0,1,256)
OutChr(nPorta,cCmd,Len(cCmd))
If IsWorking(nPorta)
   nBytes:=Inbufsize(nPorta)
   If nBytes>0
      aResposta:=Space(nbytes)
      InChr(nporta,nbytes,@aResposta)
      aResposta:=AllTrim(aResposta)
     ***O QUE FAZER AGORA
       //@ 08+i,05 say Asc(SubStr(aResposta,i,1))  mostra o numero
   EndIf
EndIf
UnInt_Port(nPorta)
PS: o aResposta contem a seguintes numeros:
Posição em nBytes
1 - 6 -> ack
2 - 0
3 - 0
4 - 25
5 - 0 -> st1
6 - 0 -> st2

Agora sei que a posição 2,3 e 4 é o número do cupom fiscal que esta em BCD, mas não consegui interpretar porque o valor tem que ficar em 000019.

Se alguém souber o que é preciso fazer e como fazer esta parte, agradeço desde já.
Muito obrigado.
Se não for pedir muito, é muito urgente. :'(
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Sessão errada....hbcomm é para xharbour.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Se bem que o problema parece estar mais relacionado à interpretação do protocolo do que com a HBComm propriamente.

Infelizmente nada conheço dessa impressora. Mas alguém pode conhecer. É só aguardar um pouco que a ajuda virá.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

Comunicação direta

Mensagem por leandrolinauer »

Desculpem a minha falha, eu estava no índice errado.
Bom, a respeito do problema acima descrito o retorno creio eu coloquei errado tbem o correto é o abaixo:

PS: o aResposta contem a seguintes numeros:
Posição em nBytes
1 - 6 -> ack
2 - 0 -> ST1
3 - 0 -> ST2
4 - 25 ->
5 - 0 ->
6 - 0 ->
Do 4 ao 6 é o retorno da situação da impressora que foi retornado 2500, mas não sei como transformar este numero em 000019 que é o conteúdo, é apenas a decodificação, segundo a bematech este retorno esta em BCD e tenho que transformar em DECIMAL

Grato pela atenção.
Obrigado. :)Pos
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Ivone Lopes da Silva
Colaborador
Colaborador
Mensagens: 80
Registrado em: 23 Out 2004 21:57
Localização: São João da Boa Vista/SP
Curtiram: 1 vez

Mensagem por Ivone Lopes da Silva »

Oi, Eu fiz a algum tempo + como não terminei não me lembro muito bem. Mais voce tem que fazer a conversão de Hexadecimal para decimal.
Nesse caso:
1 - 6
2 - 00
3 - 00
4 - 25 que será 25/16 que é igual a 1 inteiro e o resto é 9 - portanto 19
5 - 0 ST1
6 - 0 ST2

A época que pesquisei, encontrei as instruções pra conversão em www.corradi.junior.com.br
É mais ou menos isso

Ivone
Ivone Lopes da Silva
Colaborador
Colaborador
Mensagens: 80
Registrado em: 23 Out 2004 21:57
Localização: São João da Boa Vista/SP
Curtiram: 1 vez

Mensagem por Ivone Lopes da Silva »

Corrigindo...
Voce vai encontrar como fazer as conversão em:
www.corradi.junior.nom.br/sistdig1.pdf
Tá bem explicado e facil de entender.
Ivone
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Comunicação direta

Mensagem por Maligno »

leandrolinauer escreveu:Do 4 ao 6 é o retorno da situação da impressora que foi retornado 2500, mas não sei como transformar este numero em 000019 que é o conteúdo, é apenas a decodificação, segundo a bematech este retorno esta em BCD e tenho que transformar em DECIMAL
Mas se é só isso, fica mais fácil. Pensei que fosse problema de protocolo. Pelo que lembro, BCD (Binary Coded Decimal - decimal codificado em binário) é apenas o número decimal de forma ligeiramente diferente. Ou seja, o byte 25 é o próprio 25 em decimal. Cada dígito decimal é transformado em um nibble.

Aliás, BCD foi criado justamente pra facilitar a interação. Você vê o número e já sabe quanto é em decimal. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

Comunicação direta

Mensagem por leandrolinauer »

Obrigado Ivone.
Eu estava fazendo como o manual que fala tanto em retorno hexadecinal como em BCD, aí estava quebrando cabeça em BCD o que não dava certo porque não chegava no numero 000019.
Tenho que terminar até domingo no inicio do mes tenho que usar a impressora, se der tudo certo posto aqui no forum.
Muito obrigado -:]
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

Comunicação direta

Mensagem por leandrolinauer »

Consegui traduzir o retorno, agora consegui chegar na abertura do cupom e emissão de item, mas no entanto não sai nada no emulador nem na impressora, alguem sabe me informar porque,
O que eu já consegui fazer.
1-Abrir o caixa com formas de pagamento programadas
2-leiturax
3-redução z
4-cancelamento do cupom
o que falta é a venda de item, que a impressora não responde ao comando passado para ela.
Se alguem puder me passar uma linha do comando corretamente de:
1-Abre cupom com dados do cliente
2-Emite vendas com descricao em 29 caracter e acima de 29 caracter
3-Fechamento do cupom.
Grato :{
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Lenadro, eu não uso ECF, mas você já deu uma olhada no projeto ACBR, talvez por lá vc consiga alguma coisa...
http://acbr.sourceforge.net/wiki/index. ... _principal
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
dopi
Usuário Nível 2
Usuário Nível 2
Mensagens: 79
Registrado em: 23 Out 2004 12:29
Localização: Tatuí - SP
Contato:

Mensagem por dopi »

Acho que as funções abaixo podem ajudar...

Código: Selecionar todos

*************************************************************************
Static Function IBE_PREP_BUFFER(CMD)  // Calcula CheckSum de acordo com o
* protocolo da Impressora. Retorna String com o BUFFER para ser enviado
*************************************************************************
Local iSoma, iConta, LEN_CMD, STX, NBL, NBH, CSL, CSH

if empty(CMD)
   return ''
endif

CMD := chr(27) + CMD

iSoma   := SOMAASC( CMD )
LEN_CMD := len( CMD ) + 2   // + 2 = CSL + CSH
STX     := chr( 2 )
NBL     := chr( mod( LEN_CMD , 256 ) )
NBH     := chr( int( LEN_CMD / 256 ) )
CSL     := chr( mod( iSoma,  256 ) )
CSH     := chr( int( iSoma / 256 ) )

return  STX + NBL + NBH + CMD + CSL + CSH



**************************************************************************
Static Function IBE_BCD_ASC(DADOS)  // Converte String BCD para ASC
**************************************************************************
local RET := "",A,BH,BL,ASC_CHAR,BCD_CHAR

for A := 1 to len( DADOS )
   BCD_CHAR := asc( substr( DADOS, A, 1 ) )
   BH := strzero( int( BCD_CHAR / 16 ), 1, 0 )
   BL := strzero( mod( BCD_CHAR,  16 ), 1, 0 )

   ASC_CHAR := BH + BL
   RET += ASC_CHAR
next

return RET
[]s Daniel

Conheça o projeto Automação Comercial Brasil
http://acbr.sourceforge.net/
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

Comunicação direta * RESOLVIDO *

Mensagem por leandrolinauer »

Boa noite dopi e a todos colaboradores.
Valeu pelas rotinas que vc me passou, muito obrigado a minha tinha ficado um pouco grande com a sua deu uma resumida, mas o problema meu continuava até ontem, descobri que tinha que aguardar uma resposta da serial após enviado o comando e é o que eu não fazia, portanto as vezes retornava dados correto outras não. consegui dando um pequeno tempo contado para que nenhum enter passe pela rotina, mas ainda gostaria de saber se há alguma função que aguarde o término da leitura da serial,só para que fique perfeito.
Já consegui fazer tudo que necessito para funcionar a ecf em comunicação direta.
-Verificar o caixa da ecf
-Adcionar aliquotas
-Programar formas de pagamento
-Abrir caixa (leitura x) com as formas de pagamento
-Leitura x
-Redução Z
-Abrir cupom
-Vender item
-Capturar valor
-Capturar numero do cupom
-Iniciar fechamento de cupom com forma de pagamento, acréscimo ou desconto.
-Finalizar e fechar cupom
-Cancelar cupom

Ou seja tudo que precisa para colocar para funcionar, que vou fazer na segunda-feira.
Obrigado a todos que aqui me ajudaram durante estes longos meses de labuta.

Assim que tiver limpo os códigos estarei postando os comandos no codigo-fonte para todos apreciarem esta maravilha e melhorarem com comandos para as outras marcas de ecf.
Grato a todos.
-:]
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Comunicação direta * RESOLVIDO *

Mensagem por sygecom »

leandrolinauer escreveu:...consegui dando um pequeno tempo contado para que nenhum enter passe pela rotina, mas ainda gostaria de saber se há alguma função que aguarde o término da leitura da serial,só para que fique perfeito.
Millisec(1000) // Resultado: aguarda um segundo.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
dopi
Usuário Nível 2
Usuário Nível 2
Mensagens: 79
Registrado em: 23 Out 2004 12:29
Localização: Tatuí - SP
Contato:

Mensagem por dopi »

Acredito que o correto seja vc detctar que a impressora terminou de responder... Isso irá váriar de acordo com o modelo de ECF... Na maioria dos ECFs, existe um caracter "terminador" como ETX (chr(3)) ou um CR (chr(13))...

No caso da Bematech não há terminador... porém no manual é descrito o tamanho da resposta para cada comando... Exemplo: A leituraX não retorna nenhum dado, apenas o ACK + ST1 + ST2 (3 bytes)... Outros comandos que retornam dados seriam: ACK + nDADOS + ST1 + ST2...

Portanto vc deve calcular o tamanho da resposta e aguardar até que todos os bytes cheguem na serial...

Vale lembrar que em relatórios longos, como a LeituraX, o ACK vem imediatamente, e o ST1+ST2 após alguns segundos (mas antes do fim da impressão)
[]s Daniel

Conheça o projeto Automação Comercial Brasil
http://acbr.sourceforge.net/
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

Comunicação direta com HbComm

Mensagem por leandrolinauer »

Blz - Dopi.
Realmente pensei em algo como no inicializador do comando criar uma variavel com a informação do tamanho exato do retorno esperado assim o sistema aguardaria a entrada dos dados.
vou tentar e vejo se deu certo ou não.

Grato
:)Pos
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Responder