Ligação de uma impressora de cupom serial ou Balança ou outro dispositivo serial É possível ligar uma impressora serial ao conector DB9 traseiro do TED Colleter. Para fazer isto, conecte a impressora ao terminal usando o mesmo cabo que você utiliza para ligar a impressora serial no computador. O conector DB9 serial do painel traseiro do TED tem pinagem compatível com a porta serial do PC. DB9 Macho (painel traseiro) 1———————————————GND (ground) 2———————————————RX2 (entrada para balanças) 3———————————————TX1 (saída para impressora) 5———————————————CTS (entrada sinal protocolo **) 9———————————————Vcc (5Vdc) Configurações default da porta serial: Baud Rate = 9600 Bits de dados = 8 Paridade = nenhuma Stop bits = 1 5 – Protocolo / Comandos – Características da comunicação – Conexão cliente / servidor: o Terminal TED é o cliente UDP e o Host ( PC ) é o servidor UDP; – Busca automática de IP: recurso para “ganhar” automaticamente endereço de Ip do roteador da rede – veja abaixo em “CONSIDERAÇÕES SOBRE BUSCA DE IP” – Os modelos básicos da série TC-100 / TC-200 transmitem os dado digitados para o Host ( PC ) na Porta 8 em UDP. Realizam 3 (três) tentativas de transmissão, caso não receba um pacote de retorno do Host. Existem modelos especiais que aceitam configuração prévia pelo usuário, para transmissão a outros endereços de Porta, além da Porta 8; – Digitação e Transmissão de Dados: Para o TED enviar um dado para o computador é necessário digitar o dado + tecla Enter; – Leitura ( interface ) cód.barras: exatamente o mesmo efeito que a digitação anterior + tecla Enter; – Modo de apresentação: na medida em que o dado vai sendo digitado vai sendo apresentado no display ( visor ). Durante a digitação, se o dado for maior do que a linha do display, o cursor pula para a linha de baixo. Em repetidas vezes, os dados mais antigos vão sendo rolados para cima e os novos vão aparecendo sempre na última linha de baixo – veja abaixo em “CONSIDERAÇÕES SOBRE ROLAGEM DE DISPLAY”; – Correção de erro de digitação: pressionando a tecla o cursor volta e apaga toda a última linha digitada, desde o digito atual até o primeiro digito teclado, antes do último Enter . ATENÇÃO: Na lista de comandos abaixo estão resumidos os conteúdos dos pacotes a serem enviados para o TED executar cada comando. Todos estes comandos devem obedecer o protocolo de repetição 3 vezes, usando os bytes de confirmação de transmissão e confirmação de recepção. a- : Transmissão TED ao Host _ 01 XX YY ZZ DADO OD _ onde : comando 01 = TED transmite dados ao Host XX = “contador de tentativas” – flag que vai incrementando até FF em cada tentativa de transmissão. exemplo: TED transmitindo para o Host e sem resposta de retorno do Host (explo: micro desligado) então o TED vai tentar transmitir três vezes enviando o seguinte: 01 00 0A 04 31 32 33 0D 01 01 0A 04 31 32 33 0D 01 02 0A 04 31 32 33 0D O o segundo byte vai incrementando a cada tentativa 00, 01 e 02. Quando este byte chegar a FF ele deve voltar a ser 01. YY = “contador de comandos” – confirmação de transmissão, para checagem da resposta do Host; ZZ = número de bytes do dado digitado; 0D = finalizador- Formato de resposta do Host: 80 XX YY 00 _ onde: 80 = comando de confirmação de recebimento (dados em Hexadecimal); EXERCITANDO: # – TED tenta transmitir mas, por algum problema de transmissão (colisão na rede , ruído ou outro motivo) a primeira tentativa não chegue ao Host. Mas na segunda tentativa chegue normalmente. Vai acontecer então o seguinte tráfego de dados: 01 00 0A 04 31 32 33 0D 01 01 0A 04 31 32 33 0D resposta do Host : 80 01 0A 00 Neste exemplo, o Host perdeu o primeiro pacote por algum problema de ruído. Mas quando o TED transmitiu o segundo pacote o Host respondeu . Nesta resposta 01 é o retorno do mesmo flag de transmissão. Ao receber este pacote, o TED pára de transmitir porque percebe que o Host já pegou o dado corretamente pois o flag 01 “bateu” com o mesmo flag 01 da transmissão. ## – Agora suponha que, por algum motivo a resposta do Host (confirmação de recebimento) não chegue ao TED (por ruído, colisão ou outra coisa). O TED vai interpretar que o Host ainda não recebeu o dado e vai transmitir novamente. O Host, ao pegar o dado repetido, vai desprezá-lo porque já pegou este dado. Isto porque o terceiro byte (0A= confirmação de transmissão) coincide com o terceiro byte recebido no comando anterior recebido pelo Host. Se fosse realmente uma nova transmissão o TED teria incrementado este byte para 0B. ou seja: o terceiro byte é um número que vai incrementando, não a cada tentativa de transmissão do mesmo dado, mas a cada dado novo que o TED tenta transmitir. Este protocolo de confirmação de envio e confirmação de recebimento acontece nos dois sentidos: do TED para o micro e do micro para o TED e em todos os comandos implementados. b- : Transmissão Host ao TED _ b.1 – Envia mensagem ao display do TED _ 01 XX YY ZZ DADOS_ onde : comando 01 = envia mensagem para o display TED; XX = “contador de tentativas” – flag que vai incrementando até FF em cada tentativa de transmissão YY = “contador de comandos” – confirmação de transmissão, para checagem da resposta do Host; ZZ = número de bytes do dado digitado; DADOS = string a ser enviada ao display do TED; Exemplo: 01 00 04 03 41 42 43 coloca ABC no display do TED. b.2 – Toca beep inicialização _ 02 XX YY ZZ _ onde : comando 05 = TED toca beep inicialização; XX = “contador de tentativas” – flag que vai incrementando até FF em cada tentativa de transmissão YY = “contador de comandos” – confirmação de transmissão, para checagem da resposta do Host; ZZ = número de bytes do dado digitado – neste comando sempre 00 Exemplo: 02 00 02 00 toca bip de inicialização b.3 – Apaga display _ 03 XX YY ZZ _ onde : comando 03 = TED apaga display; XX = “contador de tentativas” – flag que vai incrementando até FF em cada tentativa de transmissão YY = “contador de comandos” – confirmação de transmissão, para checagem da resposta do Host; ZZ = número de bytes do dado digitado – neste comando sempre 00 Exemplo: 00 03 00 apaga o display do TED. b.4 – Toca N beeps _ 05 XX YY ZZ N _ onde : comando 05 = TED toca N beeps; XX = “contador de tentativas” – flag que vai incrementando até FF em cada tentativa de transmissão YY = “contador de comandos” – confirmação de transmissão, para checagem da resposta do Host; ZZ = número de bytes do dado digitado – neste comando sempre 01; Exemplo: 05 00 02 01 04 ted toca 4 bips b.5 – Envia mensagem para porta serial auxiliar COM1 ( impressora p.explo. ) do TED _ 06 XX YY ZZ DADOS _ onde : comando 06 = envia dados para saida auxiliar COM1; XX = “contador de tentativas” – flag que vai incrementando até FF em cada tentativa de transmissão YY = “contador de comandos” – confirmação de transmissão, para checagem da resposta do Host; ZZ = número de bytes do dado digitado; DADOS = texto / mensagem a ser impressa via COM1 Exemplo: 06 00 04 03 41 42 43 imprime ABC na porta serial auxiliar b.6 – Le dados da porta serial auxiliar COM2 ( balança p.explo. ) _ 07 XX YY 00 _ onde : comando 07 = le dados da COM2; XX = “contador de tentativas” – flag que vai incrementando até FF em cada tentativa de transmissão YY = “contador de comandos” – confirmação de transmissão, para checagem da resposta do Host; ZZ = neste caso sempre 00; Exemplo: 07 00 02 00 lê porta serial auxiliar COM2 para balanças ( pino RX2 conector DB-09 ). Parâmetros da comunicação serial : default 9600,n,8,1 Tipo de balança ( protocolo balança ): 1- Balanças sem protocolo _ existem balanças que enviam o peso imediatamente após sua realização : neste caso o procedimento descrito acima é suficiente para o tratamento dos dados lidos do peso. O TED armazena esses dados de peso num buffer e quando o Host solicita via o comando 07 ( acima ), os dados são enviados. 2 – Balanças com protocolo _ existem balanças que aguardam e chegada de um comando ENQ ( 0x05 ) para somente após enviar os dados de peso : neste caso utilizando o pino 3 da COM1 ( saída para impressora ) o TED pode enviar o comando ENQ ( 0x05 ) no formato descrito em b.5 (envia mensagem para porta serial auxiliar COM1) : Explo1 – Se quiser enviar 0x05 para a balança. Precisa enviar para o TED via UDP: 0x06, 0x00, 0x00, 0x01, 0x05 Explo2 – Se quiser enviar 0xC3, 0x0D para a balança, enviar para o TED via UDP: 0x06, 0x00, 0x00, 0x02, 0xC3, 0x0D e assim por diante. Quando o TED recebe o comando 0x07 do Host, os últimos dados recebidos da balança após o comando ENQ ( 0x05) são enviado para o Host no formato: 0x01, 0x00, 0x01, NB, D0, D1, D2,…,DN. Como descrito em b.6 CONSIDERAÇÕES SOBRE BUSCA DE IP : Para que o TED (cliente) se conecte ao micro (servidor) ele precisa descobrir primeiro o IP do micro. Ele faz isto automaticamente da seguinte forma: ao ser ligado, o TED começa a enviar um pacote broadcast de 2 em 2 segundos na porta 55555 em UDP. O micro que está rodando o software+DLL recebe este pacote (o broadcast chega em todos os dispositivos da rede). Então o micro analisa o pacote e descobre o IP de origem (ou seja o IP do TED). Em seguida o micro envia um pacote para o TED contendo o seguinte dado na porta 08 em UDP: 00 00 09 ‘Conectado]’ (os bytes estão em hexadecimal). Desta forma, o TED ‘descobre’ o IP do micro ao receber este pacote e se conecta à ele. Daí para frente o TED usará a porta 8 em UDP para se comunicar com o micro. CONSIDERAÇÕES SOBRE ROLAMENTO DO DISPLAY AO RECEBER MENSAGENS : Quando uma primeira mensagem é enviada para o display do TED1000 (comando 01), a mensagem inicial COLLETER TED1000 se apaga e a mensagem aparece na primeira coluna da última linha (obs: a mensagem recebida do micro nunca pode ser apagada pelo backspace. O backspace só consegue apagar dados digitados no teclado). A partir deste momento, se o usuário digitar alguma coisa no teclado (123, por exemplo) os dados começam a aparecer na mesma linha da mensagem recebida, (à direita do último caractere recebido).Aí sim, o backspace é capaz de apagar os dígitos teclados (3, 2, 1). Se o usuário enviar uma nova mensagem para o display (em vez de digitar, se ele eviar uma segunda mensagem com o comando 01), a nova mensagem fará o display rolar para cima , aparecendo então na primeira coluna da segunda linha. Se for enviada uma mensagem vazia (sem dados) para o display pelo comando 01, o cursor deve cair na primeira coluna da próxima linha, rolando os dados anteriores do display para cima. Mensagens maiores ou iguais a 16 caracteres: Se for enviada para o display uma mensagem de exatamente 16 caracteres, o cursor irá parar exatamente na primeira coluna da segunda linha pois será feita a rolagem de 1 linha para cima (a mensagem acaba ficando na primeira linha !). Neste caso, se o usuário digitar algo no teclado, irá aparecer na segunda linha – primeira coluna. Esta regra vale para qualquer caso de mais de 16 caracteres. Por exemplo: enviando uma mensagem de 17 caracteres, o display rola para cima, ficando a mensagem na primeira linha e mais um único caracter (final da mensagem) na segunda linha. A partir daí, se o usuário digitar algo no teclado, aparecerá na segunda coluna da segunda linha (abaixo da mensagem recebida). CONSIDERAÇÕES SOBRE A TECLA DE CORREÇÃO BACKSPACE : O TED possui no teclado a tecla usada como backspace. Durante a digitação , se houver algum erro, pode-se pressiona-la para apagar o que foi digitado. Uma vez pressionada a linha inteira que foi digitada é apagada , sendo necessária a digitação do código correto novamente. Dica para testes: toda esta comunicação pode ser facilmente verificada com o auxílio de um TED para testes, com o programa de testes da Colleter e com o programa analisador de protocolo “Wireshark”.Importante: pode acontecer de alguém desligar o TED (ou o micro) em algum momento e religá-lo de novo. Por isto é importante que o TED fique sempre enviando este pacote broadcast de 2 em 2 segundos pois, se a conexão for quebrada, ela volta a conectar automaticamente.
– Protocolos de Comunicação
Detalhes de conexão cliente/servidor:No
protocolo da DLL Colleter, o microterminal é o cliente UDP e o micro é o servidor
UDP.
Digitação e Transmissão de Dados: Para o TED enviar um dado para o
computador é necessário digitar o dado e em seguida a tecla <E> (ou então ler um código de barras, o que tem
exatamente o mesmo efeito que a digitação e o pressionamento do <E>). Na
medida em que o dado vai sendo digitado, ele vai aparecendo no display e,
enquanto isso, ele ainda pode ser corrigido pressionando backspace (TECLA < C
> ).
Quando pressionado backspace, o cursor volta e apaga toda a última linha
digitada, desde o digito atual até o
primeiro digito teclado, antes do último enter <E>.
Durante a digitação , se o dado for maior do que a linha atual, o cursor pula
para a linha de baixo. Em repetidas vezes, os dados mais antigos vão sendo
rolados para cima e os novos vão aparecendo sempre na última linha de baixo.
Pressionamento do enter <E> : transmite o dado digitado para o micro na porta 8 em UDP e tenta transmitir por três vezes, caso não receba um pacote de retorno do computador.
Exemplo de transmissão: digitando
123 e Enter no teclado do TED, ele
vai transmitir o seguinte (na porta 8 em UDP):
00 0A 04 31 32 33 0D então o micro responde para o TED
80 00 0A 00 onde 80 é o “comando de
confirmação de recebimento” (dados em Hexadecimal)
Significado dos bytes:
01 representa o comando (01 = TED
transmitindo dados ao micro)
04 é o número de bytes que vem a seguir
31 32 33 é o dado digitado (ou seja, 123)
o segundo byte (00) é um flag que vai incrementando até FF em cada tentativa de
transmissão. Por exemplo: Se o TED tentar transmitir para o micro mas ele não
responder (por exemplo, porque o micro está desligado) então o TED vai tentar
transmitir três vezes enviando o seguinte:
01 00 0A 04 31 32 33 0D
01 01 0A 04 31 32 33 0D
01 02 0A 04 31 32 33 0D
Note como o segundo byte vai incrementando a cada tentativa 00, 01 e 02. Quando
este byte chegar a FF ele deve voltar a ser 01. Agora imagine que o TED tenta
transmitir mas, por algum problema de transmissão (colisão na rede , ruído ou
outro motivo) a primeira tentativa não chegue no micro. Mas suponha que a
segunda tentativa chegue normalmente. Vai acontecer então o seguinte tráfego de
dados:
01 00 0A 04 31 32 33 0D
01 01 0A 04 31 32 33 0D
resposta do micro _ 80 01 0A 00
Neste exemplo, o micro perdeu o primeiro pacote por algum problema de ruído. Mas quando o TED transmitiu o segundo pacote o micro respondeu . Nesta resposta:
80 significa que o pacote é uma confirmação de recebimento
01 é o retorno do mesmo flag de transmissão. Ao receber este pacote, o TED pára de transmitir porque percebe que o micro já pegou o dado corretamente pois o flag 01 “bateu” com o mesmo flag 01 da transmissão.
Se por algum motivo a resposta do
micro (confirmação de recebimento) não chegue ao TED (ruído, colisão ou outra coisa), o TED vai pensar que o micro
ainda não recebeu o dado e vai transmitir novamente. O micro, ao pegar o dado
repetido, vai desprezá-lo porque já pegou este dado, percebendo isto porque o terceiro byte (0A= confirmação de transmissão) coincide com o terceiro byte
recebido no comando anterior recebido pelo micro. Se fosse realmente uma nova
transmissão o TED teria incrementado
este byte para 0B. ou seja:
=> o terceiro byte é um número que vai incrementando, não a cada tentativa
de transmissão do mesmo dado, mas a cada dado novo que o TED tenta transmitir.
Este protocolo de confirmação de envio e
confirmação de recebimento acontece nos dois sentidos: do TED para o micro e do
micro para o TED e em todos os comandos implementados.
OBS: É possível testar e analisar todos estes comandos usando um programa
analisador de protocolo. Sugerimos o programa “Wireshark” que é freeware, pode
ser achado facilmente no google e tem esta finalidade específica.
Parâmetros de comandos:
Toda vez que um comando tiver parâmetros (por exemplo , a string a ser colocada no display), o parâmetro “número de bytes” será diferente de zero e os dados de parâmetros vem logo a seguir depois do número de bytes.
LISTA DE COMANDOS:
Na lista de comandos abaixo estão resumidos os conteúdos dos pacotes a serem
enviados para o TED executar cada comando. Todos estes comandos devem obedecer
o protocolo de repetição (3 vezes) usando os bytes de confirmação de
transmissão e confirmação de recepção
Comando 05: Ted toca N beeps:
Sintaxe: 05 rep1 rep2 01 n …. onde
Rep1 = contador de tentativas
Rep2 = contador de comandos
01 = número de bytes de parâmentro que vem a seguir (sempre 01 neste comando)
N= número de bips a tocar.
Exemplo:
05 00 02 01 04
ted toca 4 bips
Comando 02: Toca um bip igual ao da inicialização do TED
Sintaxe: 02 rep1 rep2 00 …. onde
Rep1 = contador de tentativas
Rep2 = contador de comandos
00 = número de bytes de parâmentro que vem a seguir
Exemplo: 02 00 02 00 toca bip de inicialização
Comando 03: Apaga display do TED:
Sintaxe: 03 rep1 rep2 00 …… onde
Rep1 = contador de tentativas
Rep2 = contador de comandos
00 = número de bytes de parâmentro que vem a seguir
Exemplo: 00 03 00 apaga o display do TED.
Comando 01: envia mensagem para o display
Sintaxe: 01 rep1 rep2 nb dados …. onde
Rep1 = contador de tentativas
Rep2 = contador de comandos
nb = número de bytes de parâmentro que vem a seguir
dados = string a colocar no display
Exemplo: 01 00 04 03 41 42 43 coloca ABC no display do TED.
Comando 06: envia mensagem para a saída serial auxiliar (impressora)
Sintaxe: 06 rep1 rep2 nb dados …. onde
Rep1 = contador de tentativas
Rep2 = contador de comandos
nb = número de bytes de parâmentro que vem a seguir
dados = string a imprimir na saida serial auxiliar
Exemplo:
06 00 04 03 41 42 43 imprime ABC
na porta serial auxiliar