Página 1 de 2
Comunicação direta com HbComm
Enviado: 26 Mar 2008 08:43
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. :'(
Enviado: 26 Mar 2008 14:01
por sygecom
Sessão errada....hbcomm é para xharbour.
Enviado: 26 Mar 2008 15:28
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á.
Comunicação direta
Enviado: 26 Mar 2008 18:57
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
Enviado: 26 Mar 2008 22:26
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
Enviado: 26 Mar 2008 22:59
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
Re: Comunicação direta
Enviado: 27 Mar 2008 04:17
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.

Comunicação direta
Enviado: 27 Mar 2008 19:09
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 -:]
Comunicação direta
Enviado: 01 Abr 2008 18:29
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 :{
Enviado: 03 Abr 2008 19:10
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
Enviado: 04 Abr 2008 09:24
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
Comunicação direta * RESOLVIDO *
Enviado: 12 Abr 2008 21:22
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.
-:]
Re: Comunicação direta * RESOLVIDO *
Enviado: 12 Abr 2008 22:58
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.
Enviado: 14 Abr 2008 09:01
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)
Comunicação direta com HbComm
Enviado: 15 Abr 2008 11:22
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