ee_02

Embed Size (px)

Citation preview

UNIVERSIDADE FEDERAL DE GOIS ESCOLA DE ENGENHARIA ELTRICA

CONTROLE DE UM ROB AUTNOMO VIA WEB E RDIO ENLACE

Rafael Jos Cantero Ronaldo Peixoto Orientador: Prof. Jos Wilson Lima Nerys, Ph.D.

2

SUMRIO

INTRODUO....................................................................................................................04 DESENVOLVIMENTO......................................................................................................05 Cdigos em Bloco ........................................................................................................05 Largura de Hamming ...................................................................................................05 Distncia Hamming......................................................................................................05 Cdigos Cclicos...........................................................................................................06 Mensagens CRC (Cdigos de Redundncia Cclica)...................................................07 Escolha de um Polinmio.............................................................................................08 Erros de Bit Simples............................................................................................08 Erros de Dois Bits (Erros Duplos).......................................................................09 Erros com um Nmero Impar de Bits..................................................................09 Erros em Rajada...................................................................................................09 Vantagens das Tcnicas CRC para as Tcnicas de Somatrio Simples.......................10 Algoritmos para calculo de CRC..................................................................................10 Algoritmos de Tabela de Busca...........................................................................12 Algoritmo padro de Tabela de Busca.................................................................12 Algoritmo reduzido de Tabela de Busca..............................................................13 Estratgias de Correo de Erro...................................................................................14 Implementao.............................................................................................................15 Justificativas........................................................................................................17 MySQL.........................................................................................................................24 Instalao e Implementao................................................................................25 PHP...............................................................................................................................26 Instalao e Implementao................................................................................26 Apache...........................................................................................................................31 Instalao e Configurao...................................................................................31 CONCLUSO......................................................................................................................33 REFERNCIAS...................................................................................................................34 APNDICE..........................................................................................................................35

3

RESUMO

Durante a transmisso de pacotes de mensagens de um rob autnomo para um centro de controle e vice-versa, normal surgirem erros, em grande parte, devido atenuao ou distoro do sinal, alm de interferncias e rudos na linha de transmisso. Para evitar o recebimento de mensagens com erros, normal o uso de tcnicas para deteco e correo de erros. Aps o recebimento dos pacotes de mensagens, sempre interessante que haja um modo de armazenar e distribuir as informaes recebidas para que estas possam ser monitoradas distncia. Neste trabalho, procurou-se discutir e implementar formas para deteco e correo de erros introduzidos em um canal de comunicao de rdio enlace por um rob autnomo, alm da implementao de uma forma de armazenar e distribuir as informaes obtidas. A tcnica discutida e utilizada para deteco e correo de erros a CRC (Cyclic Redundancy Check) devido s inmeras vantagens que sero relatadas neste trabalho e para a implementao do mesmo, utilizou-se da ferramenta Delphi. Para disponibilizar as informaes obtidas, optou-se por usar um Banco de Dados servidor MySQL e o Apache como servidor de HTTP (Hiper Text Transfer Protocol), fazendo uso da linguagem PHP para a implementao de pginas dinmicas. Este trabalho no tem por finalidade aprofundar exaustivamente as tcnicas de deteco e correo de erros, assim como as tcnicas de armazenamento e distribuio de informaes. Contudo, fornece uma discusso de algumas das tcnicas mais usadas, alm de exemplificar atravs de algoritmos e programas as tcnicas escolhidas, facilitando, assim, trabalhos futuros.

4

ABSTRACTDuring the transmition of a autonomus robot`s message pakage for a control center and vice versa, is normal erros appear, in the most, because of the attenuation or signal distortion as well as noise of transmission line. To prevent the act of receiving of messages with errors, is normal the use of techniques for detection and correction of erros. After the act of receiving of the packages of messages, is always interesting that has a way to store and to distribute the received information os that these can be monitored long-distance. In this approach, it was looked to discuss and to implement forms for detection and correction of erros introduced in a communication channel of radio enlace for an autonomus robot, beyond the implementation of a form of storing and distributing the gotten information. The discussed technique and used for detection and correction of errors is the CRC (Cyclic Redundancy Check) because of the innumerable advantages that will be told in this work and for the implementation, was used the Delphi tool. To arrange the gotten information, it was opted to use the Data Base Server MySQL and the Apache for HTTP (Hiper Text Transfer Protocol) Server, making use of the PHP language to build dynamics pages. This approach doesn t have for purpose, exhaustingly deepen the techniques of detection and correction of erros, as well as the techniques of storage and distribution of information. However, it supplies a quarrel of some of the techniques most used, besides examplification through algorithms and programs the shosen techniques, facilitating futures approaches.

5

1 Introduo

Para um canal de transmisso por rdio enlace, necessria a utilizao de tcnicas de controle de fluxo e controle de erro para que erros de transmisso sejam evitados. Mensagens de correo de erro promovem uma maneira de detectar e corrigir erros introduzidos em um canal de transmisso. Duas categorias principais de mensagens existem: mensagens de bloco e mensagens convolucionais. Ambas introduzem redundncia pela adio de smbolos de paridade na mensagem de dados. As mensagens de checagem de redundncia cclica so um subconjunto das mensagens cclicas que so, por suas vez, subconjunto das mensagens de bloco. Implementaes CRC podem ser implementadas por hardware ou software. Em uma implementao tradicional de hardware, h um simples circuito registrador de deslocamento que permite a computao atravs da manipulao de um bit de dado por vez. Na implementao em software, manipulaes de dados como bytes ou words se tornam mais convenientes e rpidas. Escolhe-se um algoritmo particular dependendo da quantidade de memria e velocidade requeridos. Diferentes tipos de algoritmos e resultados sero apresentados neste trabalho. Aps a recepo destes pacotes de mensagens, algumas vezes necessrio a disponibilizao dos mesmos para que vrias pessoas tenham a possibilidade de acess-los. Uma das maneiras mais utilizadas o uso de um servidor HTTP (Hiper Text Transfer Protocol) e um banco de dados servidor para disponibiliz-las para que possam ser acessadas por outros computadores conectados a uma rede.

6

02- Desenvolvimento

Cdigos em Bloco

Uma mensagem em bloco consiste de um conjunto de vetores de largura fixa chamados pacotes de mensagem. A largura de um pacote de mensagem o nmero de elementos do vetor, denominado por n. Os elementos de um pacote de mensagem so selecionados de um alfabeto de q elementos. Existem 2n possveis pacotes de mensagem em uma mensagem de bloco binrio de largura n. Desses 2n pacotes de mensagem, podem ser selecionados M = 2k pacotes de mensagem (k < n) para formar uma mensagem. Logo, um bloco de k bits de informao mapeado em um pacote de mensagem de largura n, selecionado de um conjunto de M = 2k pacotes de mensagem. Isto definido como uma mensagem (n,k) e a relao k/n definida como sendo a taxa da mensagem.

Largura de Hamming

A largura Hamming de um vetor X = (x1, x2,...,xn), definida por w(X), o nmero de componentes no-zero de X. Cada componente xi um elemento de GF(q) e o vetor X chamado de word .

Distncia Hamming

A distncia Hamming entre dois vetores X e Y, definida por d(X,Y), a largura Hamming de X Y. igual ao nmero de posies no qual os dois vetores se diferem. Ela dada por: d(X,Y) = w(X Y) = w(Y X)

7

A distncia mnima, geralmente chamada de dmin de um cdigo C, a menor distncia entre todos os pares de palavras de cdigo, ou seja, a menor distncia de Hamming. necessrio e suficiente que a distncia (dmin) de um cdigo seja no mnimo d para detectar qualquer erro padro de largura d 1 ou menor. Um cdigo C pode detectar e corrigir todos os padres de erros t ou menores se, e somente se, o cdigo possuir distncia 2t + 1. Cdigos Cclicos Cdigos cclicos so uma importante classe dos cdigos lineares. Estes cdigos possuem uma estrutura algbrica muito interessante que bem adequada para implementao e construo de muitas subclasses de cdigos. Existem cdigos cclicos eficientes para deteco/correo de mltiplos erros randmicos, erros de byte e erros em rajada. Esses cdigos podem ser implementados eficientemente por circuitos de registradores de deslocamento de realimentao linear (LFSR) para codificao e decodificao serial. Um cdigo linear C dito cdigo cclico se, para qualquer vetor de cdigo u = (u0, ..., un-1

) C, o vetor u` = ( u

n-1

, u0 , ..., u

n-2

) obtido pelo deslocamento dos

componentes para a direita ciclicamente tambm um vetor de cdigo em C. Um deslocamento cclico para a direita de n do vetor (u0, ..., u n-1 ) ( u n-1 , u0 , ..., un-2

) o qual denotado por u(1). Mas genericamente denotamos um deslocamento Por esta definio, qualquer deslocamento cclico por j posies para esquerda

cclico para a direita de i posies de u ou u(x) por ui ou ui(x). (ou direita) de um vetor de cdigo ser tambm um vetor de cdigo. Para rotaes cclicas o coeficiente que deveria ser de xn , ao invs disso, usado como o coeficiente de x0 = 1. Portanto, a rotao cclica direita difere do produto com x por um mltiplo de xn 1. Este fato apresentado formalmente pelo seguinte teorema: Teorema: A rotao cclica direita de u(x) u(1)(x) = x u(x)mod(xn 1). Prova: u(1)(x) = u n-1 + u0x + u1x + ... + u n-2xn-1

8

u n-1 + u0x + u1x + ... + u n-2xn-1 + un-1xn - un-1xn xu(x) - u n-1(xn 1) = x u(x)mod(xn 1) A maior parte dos pacotes em uso atual cclica ou relacionada a pacotes cclicos. Estes pacotes so melhores descritos se os vetores forem interpretados como polinmios. E em um pacote cclico, todos os polinmios de pacote de mensagens so mltiplos de um polinmio gerador g(x) de grau n k. Este polinmio deve ser um divisor de xn 1, logo, uma mudana cclica de um vetor de pacote nos rende outro vetor de pacote. Um polinmio de mensagem mi(x) pode ser mapeado por um polinmio de pacote ci(x) = mi(x)xn-k ri(x) (i = 0,1,...,2k 1), em que ri(x) o resto da diviso de mi(x)xn-k por g(x). Para a codificao de mensagens, o primeiro passo determinar se o pacote recebido mltiplo de g(x). Isto feito dividindo o pacote recebido por g(x) e examinando o resto. Cada diviso polinomial uma operao linear, a sndrome s(x) resultante depende somente do padro de erro. Se s(x) for um polinmio todo zero, a transmisso no possui erros ou um erro indetectvel ocorreu. Se s(x) for no-zero, no mnimo um erro ocorreu. Este o principio do CRC. A mais poderosa tentativa de corrigir erros usar a sndrome para determinar os locais e valores de mltiplos erros. Mensagens CRC (Cdigos de Redundncia Cclica) Mensagens CRC so um subconjunto das mensagens cclicas e usam um alfabeto binrio de 0 e 1. A aritmtica baseada em GF(2) (Galois Field), por exemplo, adio em mdulo-2 (XOR lgico) e multiplicao em mdulo-2 (AND lgico). Assume-se a conveno de que o bit mais significativo representa o grau de maior ordem do polinmio. Suponha m(x) o polinmio de mensagem, c(x) o polinmio de pacote e g(x) o polinmio gerador, temos que c(x) = m(x)g(x) que pode ser sempre escrito usando uma forma sistemtica c(x) = m(x)xn-k + r(x), onde r(x) o remanescente da diviso de m(x)xn-k por g(x) e r(x) representa os bits CRC. A mensagem transmitida c(x) contem k bits de informao e n k bits de CRC, por exemplo, c(x) = mk-1xn-1 + .... + m0xn-k + rn-k-1xn-k-1 + r0. Multiplicando m(x) por xn-k, estamos adicionando n k bits na mensagem, calculando os bits CRC pela diviso de m(x)xn-k por g(x), e adicionando os n k bits de CRC na mensagem.

9

Para a parte de decodificao, o mesmo algoritmo pode ser usado. Se c(x) for a mensagem recebida, ento nenhum erro ocorreu ou erros indetectveis ocorreram se c(x) um mltiplo de g(x), que equivalente a determinar que se c(x)xn-k mltiplo de g(x), se for, o remanescente da diviso de c(x)xn-k por g(x) 0 (zero). A figura 01 exemplifica essa situao.

Figura 01 Gerao e checagem de mensagens CRC

Escolha de um Polinmio A performance de uma mensagem CRC dependente de seu polinmio gerador. Para podermos escolher um polinmio eficaz, devemos antes estudar os possveis padres de erros que estamos querendo detectar e como detecta-los. Erros de Bit Simples Um erro de bit simples do tipo E = 1000...000. Podemos assegurar que esta classe de erro sempre detectada garantindo que o polinmio gerador ( g(x) ) possui no mnimo dois bits iguais a 1. Qualquer polinmio mltiplo de g(x) ser criado por

10

adies e deslocamentos e impossvel criar um valor com um simples bit por deslocamentos e adies de um valor com mais de um bit igual a 1. Erros de Dois Bits (Erros Duplos) Para detectar todos os erros da forma 100...000100...000, devemos escolher um g(x) que no seja mltiplo de 11, 101, 1001, 10001, 100001, etc. Ou seja, todos os erros duplos sero detectados se g(x) no dividir xk + 1 para qualquer k, at o valor mximo do tamanho do quadro. Erros com um Nmero Impar de Bits Podemos detectar todos os erros que consistem em um nmero impar de bits tornando x + 1 um fator de g(x), pois no existe nenhum polinmio com nmero impar de termos que tenha x + 1 como fator no sistema modulo 2. Erros em Rajada Um erro em rajada do tipo E=000...000111...1110000....00. Ou seja, consiste de zeros com exceo de uma linha de 1s em algum lugar. Esse tipo de erro pode ser reescrito como E = (1000...00)(11111...111) onde existem z zeros na parte a esquerda e n uns na parte direita. Para detectar erros desse tipo, devemos escolher um g(x) com o bit menos significativo igual a 1. Os polinmios mais usados atualmente, buscando a deteco dos padres de erros vistos, so mostrados na Tabela 01.

Mensagem CRC CRC-CCITT (x25) CRC-32 (Ethernet)

polinmio Gerador x16 + x12 + x5 + 1 x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1

GSM TCH/FS-HS-EFS (Channel coding for x3 + x + 1 speech traffic channels)

11

GSM TCH/EFS pre-coding (Preliminary x8 + x4 + x3 + x2 + 1 channel coding for Enhanced Full Rate) GSM control channels FIRE cod (Channel x40 + x26 + x23 + x17 + x3 + 1 coding for control channels) Tabela 01 CRC comumente usados e polinmios Geradores associados

Vantagens das Tcnicas CRC para as Tcnicas de Somatrio Simples A gerao do CRC possui vrias vantagens sobre as tcnicas de somatrio ou checagem de paridade. A correo de erros CRC pode detectar: 1. Erros de bit simples; 2. Erros de bits duplos; 3. Erros de bits em rajada (bits prximos). Uma checagem de bit de paridade detecta apenas erros de bits simples. A correo de erros CRC e mais usada onde grandes pacotes de dados so transmitidos, por exemplo, em locais com redes de computadores como a Ethernet. Algoritmos para calculo de CRC

O algoritmo bitwise (CRCB) simplesmente uma implementao de software sobre o que pode ser feito em hardware usando registrador de deslocamento de realimentao linear (LFSR). A figura 02 ilustra uma implementao de hardware genrica. Este registrador de deslocamento controlado por um clock. A cada pulso de clock, o dado de entrada rotacionado no registrador em adio para transmisso do dado. Quando todos os bits de entrada tiverem sido processados, o registrador de deslocamento ir conter os bits de CRC, que sero entregues na linha de dados.

12

Figura 02. Gerao de CRC usando registrador de deslocamento de realimentao linear (LFSR) Assuma agora que os bits de checagem so armazenados em um registrador referido como um registrador CRC, uma implementao em software poderia ser:

1. CRC 0 2. Desloque a mensagem para a esquerda de W bits (Mensagem XOR W) 3. Enquanto (mais bits da mensagem) faa passos 4 e 5 4. Desloque o CRC para a esquerda por um bit, adicionando o prximo bit da mensagem no bit menos significativo 5. Se (um bit pulou do registrador durante o passo 4) ento CRC CRC XOR Polinmio

Implementaes mais rpidas podem ser atingidas pela utilizao de dados de unidades mais largas que bits, desde que o tamanho no exceda o grau do polinmio gerador. No entanto um ganho de velocidade corresponde a um aumento de memria, pois valores pr-calculados (tabelas de procura) sero usados.

13

Algoritmos de Tabela de Busca Um pacote de mensagem pode ser escrito como c(x) = xn-km(x) + r(x) = a(x)g(x) + r(x), onde r(x) o polinmio CRC da mensagem de entrada m(x). Vamos aumentar a mensagem por bits. Nos consequentemente temos m(x) = xc(x) + b(x), onde b(x) = b-1xa-1 + ... + b0 o novo pacote de bits adicionado. O CRC da mensagem adicionada o remanescente de xn-km(x) dividido por g(x), chamado por r(x). Temos que r(x) = Rg(x)xn-km(x). Expandindo o dividendo iremos obter: xn-km(x) = xn-kxc(x) + b(x) = xn-kb(x) + xa(x)g(x) + xr(x), ento: r(x) = Rg(x) xn-kb(x) + xr(x). Expandindo o resultado, teremos r(x) = Rg(x)(b-1 + rn-k-1) xn-k-1+ + ... + (b0 + rn-k-) xn-k + rn-k--1 xn-k-1 + ... +r0x A ultima equao relata os bits de checagem para uma mensagem acrescida de bits de checagem da mensagem original. Note que se n k = , ento: r(x) = Rg(x)(b-1 + rn-k-1) xn-k-1+ + ... + (b0 + rn-k-) xn-k Diferentes algoritmos de calculo de CRC devem ser vistos como mtodos para calcular r(x) de r(x) e b(x). Valores prticos de so 8 ou 16, visto que ele corresponde a vrios comprimentos de palavra de maquina. Algoritmo padro de Tabela de Busca A idia por traz dos algoritmos padres de Tabela de Busca pre-calcular os valores CRC de todas as combinaes de bits almejados. Portanto, 2(n k) valores de bit word so necessrios, que limita implementaes praticas para valores pequenos de . Assuma agora que os bits de checagem so armazenados em um registrador denominado CRC, o algoritmo ser:

14

(Se < n k): 1) CRC 0, que , atribuir 0 ao conjunto de bits (rn-k-1, .., r0) 2) Faa uma XOR com os bits de entrada e com o contedo do registrador CRC rotacionado para a direita por n k - bits, que , fazer uma XOR com os bits (rn-k-1, ..., rn-k-) 3) Encontre o valor correspondente na tabela de busca e faa uma XOR com o contedo do registrador CRC rotacionado a esquerda por bits, que , fazer uma XOR com os bits (r-1, ..., r0). Este o novo valor CRC. 4) Repita os passos 2 e 3 at alcanar o final da mensagem. No caso onde = n k, os passos 2 e 3 vo ser um pouco diferentes: 2) Faa uma XOR com os bits de entrada e o registrador CRC, que , fazer uma XOR com os bits (rn-k-1, ..., r0). Encontre o valor correspondente na tabela de busca. Este o novo valor CRC.

Algoritmo reduzido de Tabela de Busca Este algoritmo uma variante do algoritmo padro de tabela de busca para aplicaes onde o espao de memria de maior importncia. O montante de memria requerido para armazenar a tabela de busca significamente reduzido e igual a (n k) bit words. A idia bsica lanar a expresso Rg(x)(b-1 + rn-k-1) xn-k-1+ + ... + (b0 + rn-k-) xn-k no somatrio Rg(x)(b-1 + rn-k-1) xn-k-1+ + ... + Rg(x)(b0 + rn-k-) xn-k. Cada termo do somatrio pode ser 0 ou 1. Se (b-1-i + rn-k-1-i) 0, ento Rg(x)(b-1-i + rn-k-1-i) xn-k-1+-i igual a 0. Logo voc apenas necessita pre-calcular os valores correspondentes a Rg(x)xnk-1+-i

com i = 0, ..., ( - 1). O algoritmo ser:

(Se < n k):

15

1) CRC 0, que , atribuir 0 ao conjunto de bits (rn-k-1, .., r0) 2) Faa uma XOR com os bits de entrada e com o contedo do registrador CRC rotacionado para a direita por bits, que , fazer uma XOR com os bits (rn-k-1, ..., rn-k-) 3) Para cada bit deste valor ( bits), se ele for igual a 1, encontre o valor correspondente na tabela de busca e faa uma XOR com o contedo do registrador CRC e este. 4) Faa uma XOR com este valor e o CRC rotacionado para a esquerda de bits, isto , faa uma XOR com os bits (r-1, ..., r0). Este o novo valor do CRC. 5) Repita os passos de 2 a 4 at alcanar o final da mensagem. No caso onde = n k, os passos 2 e 4 vo ser um pouco diferentes: 2) Faa uma XOR com os bits de entrada e o CRC, isto , faa uma XOR com os bits (rn-k-1, ...,r0). 3) O valor calculado no passo 3 o novo valor de CRC

Note que apenas o passo 3 difere do algoritmo padro de tabela de busca. No entanto, h um incremento de processamento pelo fato que cada bit deve ser testado e se este for igual a 1, uma operao XOR deve ser feita. Estratgias de Correo de Erro

Aps a deteco de erros no canal de comunicao com o uso de CRC, h basicamente dois modos de se obter a mensagem correta. Pode-se tentar corrigir os erros transmitidos com o uso da Sndrome, sem necessidade de retransmisso dos mesmos ou simplesmente identifica-los e pedir retransmisso da mensagem. Comunicaes digitais modernas tendem a favor da tcnica de retransmisso enquanto tecnologias de armazenamento (HDD) tendem a usar tcnicas de correo.

16

Implementao Para fornecer um meio seguro de comunicao por rdio frequncia entre o rob autnomo e a central, onde as informaes recebidas com erros possam ser detectadas e corrigidas, buscou-se utilizar os mdulos TX2 e RX2 da Radiometrix http://www.radiometrix.com/ (transmissor e receptor UHF FM) pois os mesmos j foram adquiridos pelo Ncleo PEQ. A figura 03 ilustra os mdulos de transmisso e recepo (TX2 e RX2).

Figura 03 Mdulos TX2 e RX2

Algumas especificaes dos mdulos (Datasheet com todas as especificaes dos mdulos pode ser encontrado no endereo citado): Taxas de transmisso de at 160 kbps; Distncias de at 75 m em reas construdas; Distncias de at 300 m em reas abertas; Frequncia de 433,92 MHz; Tenso de 2,2V a 6V (para o transmissor); Tenso de 3V a 6V (para receptor).

17

Para testes no Laboratrio PEQ dos mdulos TX2 e RX2 da Radiometrix, foram criadas pelos mestrandos Wanir e Antnio, duas placas, uma com um modulo de transmisso e outra com um modulo de recepo, conforme figura 04.

Figura 04 Mdulos TX2 e RX2 em placa para teste A figura 05 mostra o circuito impresso das placas para teste. Este circuito j foi projetado para permitir a conexo dos mdulos TX2 e RX2.

Figura 05 Circuito impresso das placas para teste

18

Componentes utilizados para montagem da placa para teste: Componentes Max232 Capacitores de 1 F Regulador de Tenso 7805 Mdulo TX2 da Radiometrix Mdulo RX2 da Radiometrix Conector db9 fmea Quantidade 01 05 01 01 01 01

Foram realizados testes simples com o uso do Hiperterminal de dois computadores, e com a digitao de algumas palavras, verificou-se o funcionamento dos mdulos e a necessidade de um controle de erro poderoso. Constatada a necessidade de um controle de erro poderoso, decidiu-se utilizar a tcnica de CRC (Cyclic Redundancy Check) devido s inmeras vantagens dela sobre as demais tcnicas j apresentadas neste trabalho. Optou-se por desenvolver um programa para gerao e verificao de cdigos CRC com as seguintes caractersticas: Polinmio gerador: x8 + x4 + x3 + x2 + 1; Algoritmo para calculo do CRC: algoritmo bitwise (CRCB); Linguagem para desenvolvimento: Delphi; Sistema Operacional de desenvolvimento: Windows 9x e 2000; Pedido de retransmisso caso seja identificado alguma mensagem com erro. Justificativas: Optou-se pela utilizao do polinmio gerador x8 + x4 + x3 + x2 + 1 para facilitar a implementao de programas para calculo de CRC em microcontroladores da famlia 8051, pois o mesmo possui, na sua maioria, registradores de 8 bits e um polinmio de grau nove gera mensagens CRC com oito bits. O algoritmo bitwise (CRCB) foi utilizado devido sua maior facilidade de implementao e tambm por termos verificado que a taxa de transmisso de pacotes de mensagens seria relativamente baixa, devido a restries do microcontrolador 8051 (menor

19

que 19600 bps) e que a quantidade de mensagens enviadas tambm seria baixa, podendo assim ser usado o algoritmo bitwise(CRCB). O desenvolvimento de um programa para gerao e verificao de cdigos CRC foi realizado com o auxilio da ferramenta Delphi devido aos seguintes fatos: maior conhecimento e bagagem sobre esta ferramenta e linguagem; possibilidade do uso da mesma ferramenta para a comunicao com o Banco de Dados MySQL; utilizao de um componente j conhecido (Async32) para comunicao serial; pouco tempo disponvel para aprendizagem de uma nova linguagem. No entanto, esta ferramenta apresenta a desvantagem de no ser gratuita, sendo possvel adquiri-la gratuitamente somente por intervalos curtos de tempo e em verses anteriores. O sistema operacional utilizado para o desenvolvimento do programa foi o Windows pelo simples fato do uso da ferramenta Delphi e principalmente do uso do componente para comunicao serial (Async32) que utiliza a API do windows. A utilizao do pedido de retransmisso para mensagens com erros detectados se deve ao fato da taxa de transmisso dos pacotes de mensagem ser relativamente baixa e a quantidade de mensagens enviadas tambm ser baixa, alm do fato do pouco tempo para um estudo dos mtodos e algoritmos para correo de erros com o uso da Sndrome. As funes e procedimentos mais importantes do programa para a gerao e verificao de cdigos CRC so apresentadas abaixo: function MSB(valor: word): byte; begin if (valor and $8000) = $8000 then result := 1 else result := 0; end;

20

Function CRC(msg: String) : byte; const poly = $11D; //100011101 var i: byte; msg_int: word; sai_um: boolean; begin result := 0; msg_int := ord(msg[1]) shl 8; for i := 1 to 16 do begin if (result and $80) = $80 then sai_um := true else sai_um := false; result := (result shl 1) + MSB(msg_int); msg_int := msg_int shl 1; if sai_um = true then result := result xor poly; end; end; function TesteCrc(msg: word):byte; const poly = $11D; //100011101 var i: byte; sai_um: boolean; begin result := 0; for i := 1 to 16 do begin if (result and $80) = $80 then sai_um := true else sai_um := false; result := (result shl 1) + MSB(msg);

21

msg := msg shl 1; if sai_um = true then result := result xor poly; end; end; O programa trabalha com mensagens de 8 bits e gera para estas um cdigo CRC tambm com 8 bits. O programa trabalha com a mensagem da seguinte forma: Os primeiros trs bits da mensagem representam a distncia percorrida pelo rob na posio x (em centmetros). O quarto bit da mensagem responsvel por determinar o sentido do deslocamento na posio x. Se este bit for zero, houve um deslocamento no sentido positivo do eixo x, caso contrrio, houve um deslocamento no sentido negativo do eixo x. Do quinto ao stimo bit so usados para representar o deslocamento do rob na direo y (em centmetros). O oitavo bit da mensagem responsvel por determinar o sentido do deslocamento na posio y. Se este bit for zero, houve um deslocamento no sentido positivo do eixo y, caso contrrio, houve um deslocamento no sentido negativo do eixo y. A figura abaixo representa a mensagem com suas divises. Sy Y Y Y Sx X X X Figura 06 Mensagem enviada Todo o cdigo do programa para a gerao e verificao de cdigos CRC apresentado no APNDICE deste trabalho. Abaixo as figuras dos programas testes para gerao e verificao de cdigos CRC.

22

Figura 07 Programa teste

Figura 08 Programa Teste Abaixo a figura do programa para a gerao e verificao de cdigos CRC, assim como atualizao do servidor MYSQL, desenvolvido com a ferramenta Delphi.

23

Figura 09 Programa para gerao e verificao De cdigos CRC e atualizao do MYSQL Para testes do componente para comunicao serial (Async32) que utiliza a API do windows, conectou-se dois computadores com o uso de um cabo db9-db9 cruzado com as seguintes caractersticas: Pinagem: Nome DCD RD TD DTR SGND DSR RTS CTS RI Descrio Data Carrier Detect Receive Data Transmit Data Data Terminal Ready Ground Data Set Ready Request To Send Clear To Send Ring Indicator

Nmero do pino 1 2 3 4 5 6 7 8 9

Conexo dos seguintes pinos dos conectores:

24

Pino do conector A 2 3 4 5 6 7 8

Pino do conector B 3 2 6 5 4 8 7

25

MySQLO servidor de banco de dados MySQL foi escolhido pois apresenta as seguintes vantagens: servidor de banco de dados muito rpido; multi-usuario; multi-threaded; multi-plataforma (AIX, BSDI, FreeBSD, HP-UX, Linux, Solaris, Win95, Win98, NT, and Win2000, SunOS, etc); robusto SQL (Structured Query Languange); gratuito (licenciado com o GNU GENERAL PUBLIC LICENSE); estvel; APIs para C, C++, Eiffel, Java, Perl, PHP, Python, Delphi e Tcl; atualizado constantemente. Em fevereiro de 2002, no teste, que ponto de referncia de bancos de dados, realizado por Ziff Davis Media Inc., a companhia por traz da PC Magazine, eWeek e outras bem conhecidas publicaes, o servidor MySQL foi considerado com melhor performance e estabilidade juntamente com o Oracle9i. Os bancos de dados testados foram: IBM DB2 7.2, Microsoft SQL Server 2000, MySQL-Max 4.0.1, Oracle 9i 9.0.1.1.1 and Sybase ASE 12.5.0.1. A figura abaixo mostra graficamente os resultados obtidos com o teste.

26

Figura 10 Resultados do teste realizado por Ziff Davis Media Inc.

Instalao e ImplementaoO servidor MySQL utilizado foi o MySQL verso 3.23.49. Inicialmente, instalou-se o servidor no diretrio c:\mysql e, em seguida, a senha de root foi alterada com o seguinte comando no shell:

mysqladmin -u root password new_password

A tabela Rob foi criada na base de dados test (base de dados j existente no servidor) com o seguinte comando SQL:

CREATE TABLE ROBO (I AUTO_INCREMENT INT(11), POSX NOT NULL INT(11), POSY NOT NULL INT(11), T TIME);

27

PHPPHP uma linguagem que permite criar sites WEB dinmicos, possibilitando uma interao com o usurio atravs de formulrios, parmetros da URL e links. A diferena de PHP com relao a linguagens semelhantes a Javascript que o cdigo PHP executado no servidor, sendo enviado para o cliente apenas o html puro. Desta maneira possvel interagir com bancos de dados e aplicaes existentes no servidor, com a vantagem de no expor o cdigo fonte para o cliente. Isso pode ser til quando o programa est lidando com senhas ou qualquer tipo de informao confidencial. O que diferencia PHP de um script CGI escrito em C ou Perl que o cdigo PHP fica embutido no prprio HTML, enquanto nos outros casos, necessrio que o script CGI gere todo o cdigo HTML, ou leia de um outro arquivo. A linguagem PHP foi escolhida, pois apresenta as seguintes vantagens: maior velocidade de resposta e criao de sites devido a sua syntax superior a ASP e JSP; maior possibilidade de desenvolvimento de aplicativos Web poderosos; multi-plataforma (Windows 98, 2000, NT, Linux, Unix, IIS, Apache, etc); permite acesso a vrias funes e ferramentas (funes WDDX, XML, Oracle, MySQL, IMAP, etc); atualizado constantemente; gratuito.

Instalao e ImplementaoFoi criada a pasta: C:\php3 O arquivo php-3.0.16-win32.zip foi descompactado neste diretrio. O arquivo php3.ini.dist.txt foi copiado para o diretrio C:\Windows, renomeando este para php3.ini. Procurou-se pela linha extension_dir no arquivo php3.ini e inclui-se o seguinte parmetro: c:\php3.

28

O trecho do arquivo abaixo mostra como a linha extension_dir deve ser modificada. ;;;;;;;;;;;;;;;;;;;;;;;;; ; Paths and Directories ; ;;;;;;;;;;;;;;;;;;;;;;;;; include_path=; UNIX: "/path1:/path2" Windows: "\path1;\path2" doc_root=; the root of the php pages, used only if nonempty user_dir=; the directory under which php opens the script using /~username, used only if nonempty ;upload_tmp_dir=; temporary directory for HTTP uploaded files (will use system default if not specified) upload_max_filesize=2097152 extension_dir=C:\PHP3 ./ ; 2 Meg default limit on file uploads

Procurou-se pelo trecho Dynamic Extensions no arquivo de configurao do PHP3 e descomentou-se as linhas (apagou-se o ponto e vrgula que antecede cada parmetro de configurao). ;;;;;;;;;;;;;;;;;;;;;; ; Dynamic Extensions ; ;;;;;;;;;;;;;;;;;;;;;; ; if you wish to have an extension loaded automaticly, use the ; following syntax: extension=modulename.extension ; for example, on windows, ; extension=msql.dll ; or under UNIX, ; extension=msql.so ; Note that it should be the name of the module only, no directory information ; needs to go here. Specify the location of the extension with the extension_dir directive above.

29

;Windows Extensions extension=php3_mysql.dll extension=php3_calendar.dll extension=php3_dbase.dll extension=php3_gd.dll extension=php3_dbm.dll extension=php3_mssql.dll extension=php3_zlib.dll extension=php3_filepro.dll extension=php3_imap4r1.dll extension=php3_ldap.dll extension=php3_crypt.dll extension=php3_msql2.dll extension=php3_odbc.dll Aps a instalao do PHP 3.0.16 para Windows, criou-se o seguinte cdigo em PHP para conexo com o Servidor MYSQL e para visualizao dos dados da tabela ROBO em um navegador Web. Posicoes do Robo Posicoes do Robo durante intervalos de tempo! Este cdigo produz a pgina da figura abaixo:

31

Figura 11 Pgina produzida pelo cdigo em PHP

32

ApacheO Servidor Apache foi escolhido, pois apresenta as seguintes vantagens:

Fcil implantao e administrao; Permite criar sites usando domnios virtuais; Permite criao de sites dinmicos usando CGIs ou linguagens como PHP; Permite criar sites protegidos por senhas; Implementao de acesso seguro (https); Alto nvel de customizao e confiabilidade; Implementao para pginas wap; Multi-plataforma (Windows, Linux, etc); Gratuito. Instalao e ConfiguraoExecute o utilitrio de instalao (apache1.3.1.exe), que esta disponvel para download no site http://www.apache.org/ e seguiu-se os passos de instalao normalmente. O prximo passo foi a configurao do servidor de pginas HTTP. Comeando pelo arquivo httpd.conf, localizado em C:\Apache\conf, editou-se este, adicionando as seguintes linhas no final do mesmo. ServerName localhost ScriptAlias /php3/ "c:/php3/" AddType application/x-httpd-php3 .php3 .php Action application/x-httpd-php3 "/php3/php.exe" A primeira linha informa ao apache o nome do servidor. A segunda linha informa ao apache que execute scripts php. A terceira informa as extenses dos scripts php que sero executados pelo servidor de web, ou seja, qualquer arquivo com extenso .php3 ou php ativar o client side script. A quarta linha informa o caminho path do PHP.

33

Aps a configurao do servidor, criou-se uma pgina inicial no diretrio htdocs/homepage no diretrio de instalao do Apache. A figura abaixo mostra a pgina criada.

Figura 12 Pgina inicial

34

CONCLUSOEste trabalho buscou fornecer uma discusso de algumas das tcnicas mais usadas para deteco e correo de erros em mensagens recebidas, alm de exemplificar atravs de algoritmos e programas as tcnicas escolhidas. Este trabalho tambm teve por finalidade demonstrar uma tcnica de disponibilizar as informaes recebidas para uma posterior utilizao das mesmas. Para esta demonstrao, utilizou-se da linguagem PHP, do banco de dados servidor MYSQL e do servidor de HTTP APACHE. Os resultados obtidos na implementao foram satisfatrios, provando a vantagem da tcnica CRC para deteco de erros e provando tambm que possvel implementar o controle de um rob autnomo via rdio enlace, armazenando os dados obtidos para serem visualizados por um computador em uma rede de computadores. Como proposta para melhoria do projeto pode-se destacar o uso dos mdulos TX2 e RX2 na implementao, o uso da Sindrome para correo das mensagens recebidas com erros ao invs de pedir retransmisso das mesmas, um mtodo em Java para atualizar a pgina sempre que houver alterao e a unio com o projeto final Rob Autnomo para Mapeamento de Ambientes desenvolvido pelos alunos Jorge Humberto e Renato Alves Borges.

35

REFERNCIAS[01] [02] [03] [04] [05] [06] [07] STALLINGS, W. Data and Computer Communications, sixth edition, PrenticeRODEN, M. S. Digital and Data Communication Systems, first edition, PrenticeGIBSON, J. D. Principles of Digital and Analog Communication Systems, LATHI, B. P. Modern Digital and Analog Communication Systems, first EE 387 Error-Correcting Codes, May 3,2002. GEREMIA, P Cyclic Redundancy Check Computation: An Implementation WILLIAMS, R. N. A Painless Guide to CRC Error Detection Algorithms, third

Hall Inc., 2000 Hall Inc. 1982 second edition, Macmillian Inc., 1993 edition, Oxford University Press, 1998

Using the TMS320C54x, Application Report, Texas Instruments edition, 1993

36

APNDICEunit UProjetoFinal; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, StdCtrls, Grids, DBGrids, libmysql, CommInt, ExtCtrls, Menus, ComCtrls, ToolWin, ImgList, VaClasses, VaComm, VaModem; type TFrmUpdate = class(TForm) MmRx: TMemo; cbcrc: TCheckBox; Timer: TTimer; CoolBar1: TCoolBar; ToolBar1: TToolBar; TBConfig: TToolButton; TBConc: TToolButton; TBDesconec: TToolButton; PopMCom: TPopupMenu; StatusBar1: TStatusBar; Porta1: TMenuItem; COM11: TMenuItem; COM21: TMenuItem; BaudRate1: TMenuItem; N3001: TMenuItem; N12001: TMenuItem; N96001: TMenuItem; N24001: TMenuItem; N192001: TMenuItem; N560001: TMenuItem;

37

ImageList1: TImageList; ToolButton1: TToolButton; ToolButton2: TToolButton; ToolButton3: TToolButton; Label1: TLabel; EdtError: TEdit; Comm: TVaComm; VaModem1: TVaModem; Pacote: TMenuItem; Unido1: TMenuItem; Separado1: TMenuItem; ToolButton4: TToolButton; ToolButton5: TToolButton; procedure TimerTimer(Sender: TObject); procedure TBConcClick(Sender: TObject); procedure TBDesconecClick(Sender: TObject); procedure TBConfigClick(Sender: TObject); procedure N3001Click(Sender: TObject); procedure N12001Click(Sender: TObject); procedure N24001Click(Sender: TObject); procedure N96001Click(Sender: TObject); procedure N192001Click(Sender: TObject); procedure N560001Click(Sender: TObject); procedure COM21Click(Sender: TObject); procedure COM11Click(Sender: TObject); procedure CommError(Sender: TObject; Errors: Integer); procedure CommRxBuf(Sender: TObject; Data: PVaData; Count: Integer); procedure cbcrcClick(Sender: TObject); procedure Unido1Click(Sender: TObject); procedure Separado1Click(Sender: TObject); procedure ToolButton4Click(Sender: TObject); private { Private declarations }

38

public { Public declarations } end; var FrmUpdate: TFrmUpdate; procedure UpdateMySQL(x,y: string); procedure FindXY(Chr: string); procedure UpdateGrafic(x,y: integer); function TesteCrc(msg: word):byte; function MSB(valor: word): byte; Function CRC(msg: String) : byte; implementation uses UProjetoFinalGrafic; {$R *.dfm} var // MySQL data FMYSQL: PMYSQL; robox, roboy, LineData: string; LineDataCrc, send, first: word; Erro, count: integer; iniciar: boolean; function MSB(valor: word): byte; begin if (valor and $8000) = $8000 then result := 1 else result := 0; end;

39

Function CRC(msg: String) : byte; const poly = $11D; //100011101 var i: byte; msg_int: word; sai_um: boolean; begin result := 0; msg_int := ord(msg[1]) shl 8; for i := 1 to 16 do begin if (result and $80) = $80 then sai_um := true else sai_um := false; result := (result shl 1) + MSB(msg_int); msg_int := msg_int shl 1; if sai_um = true then result := result xor poly; end; end; function TesteCrc(msg: word):byte; const poly = $11D; //100011101 var i: byte; sai_um: boolean; begin result := 0; for i := 1 to 16 do begin if (result and $80) = $80 then sai_um := true else sai_um := false;

40

result := (result shl 1) + MSB(msg); msg := msg shl 1; if sai_um = true then result := result xor poly; end; end; procedure FindXY(Chr: string); var letra: char; numero: word; sinalx, sinaly, numerox, numeroy: integer; begin letra := char(Chr[1]); numero := ord(letra); if (numero and $08) = $08 then sinalx := -1; if (numero and $08) = $00 then sinalx := 1; if (numero and $80) = $80 then sinaly := -1; if (numero and $80) = $00 then sinaly := 1; numerox := sinalx*(numero and $07); numeroy := sinaly*((numero and $70) div 10); robox := inttostr(numerox); roboy := inttostr(numeroy); end;

procedure UpdateMySQL(x,y: string); var Query, t: string; begin t := FormatDateTime('hh:nn:ss',Now); Query := 'insert into robo(posx, posy, t) values (' + x + ',' + y +',"' + t + '")'; //parametros para conectar com o mysql FMYSQL := mysql_connect(nil, PChar('localhost'), PChar('root'), PChar('eletrica'));

41

if FMYSQL = nil then DatabaseError('Erro ao connectar com o MySQL server!'); //parametros para conectar com um banco especifico if mysql_select_db(FMYSQL, PChar('test')) 0 then DatabaseError(mysql_error(FMYSQL)); //executa a query if mysql_query(FMYSQL, PChar(Query)) 0 then DatabaseError(mysql_error(FMYSQL)); //finaliza coneccao mysql_close(FMYSQL); end; procedure TFrmUpdate.TimerTimer(Sender: TObject); begin StatusBar1.Panels[3].Text := FormatDateTime('hh:nn:ss',Now); EdtError.Text := inttostr(erro); end; procedure TFrmUpdate.TBConcClick(Sender: TObject); begin try Comm.Open; first := 1; MMRx.Clear; FrmGrafic.Image1.Canvas.Rectangle(0,0,593,417); iniciar := true; TBConfig.Enabled := false; TBConc.Enabled := false; TBDesconec.Enabled := true; StatusBar1.Panels[0].Text := 'Conectado '; Erro := 0; except showmessage('No foi possivel abrir a porta: ' + Comm.DeviceName); end;

42

end; procedure TFrmUpdate.TBDesconecClick(Sender: TObject); begin try Comm.Close; TBConfig.Enabled := true; TBConc.Enabled := true; TBDesconec.Enabled := false; StatusBar1.Panels[0].Text := 'Desconectado '; except showmessage('No foi possivel fechar a porta: ' + Comm.DeviceName); end; end; procedure TFrmUpdate.TBConfigClick(Sender: TObject); begin PopMCom.Popup(FrmUpdate.Left+10,FrmUpdate.Top+60); end; procedure TFrmUpdate.N3001Click(Sender: TObject); begin N3001.Checked := true; N12001.Checked := false; N24001.Checked := false; N96001.Checked := false; N192001.Checked := false; N560001.Checked := false; Comm.BaudRate := br300; StatusBar1.Panels[1].Text := '300'; end; procedure TFrmUpdate.N12001Click(Sender: TObject);

43

begin N3001.Checked := false; N12001.Checked := true; N24001.Checked := false; N96001.Checked := false; N192001.Checked := false; N560001.Checked := false; Comm.BaudRate := br1200; StatusBar1.Panels[1].Text := '1200'; end; procedure TFrmUpdate.N24001Click(Sender: TObject); begin N3001.Checked := false; N12001.Checked := false; N24001.Checked := true; N96001.Checked := false; N192001.Checked := false; N560001.Checked := false; Comm.BaudRate := br2400; StatusBar1.Panels[1].Text := '2400'; end; procedure TFrmUpdate.N96001Click(Sender: TObject); begin N3001.Checked := false; N12001.Checked := false; N24001.Checked := false; N96001.Checked := true; N192001.Checked := false; N560001.Checked := false; Comm.BaudRate := br9600; StatusBar1.Panels[1].Text := '9600';

44

end; procedure TFrmUpdate.N192001Click(Sender: TObject); begin N3001.Checked := false; N12001.Checked := false; N24001.Checked := false; N96001.Checked := false; N192001.Checked := true; N560001.Checked := false; Comm.BaudRate := br19200; StatusBar1.Panels[1].Text := '19200'; end; procedure TFrmUpdate.N560001Click(Sender: TObject); begin N3001.Checked := false; N12001.Checked := false; N24001.Checked := false; N96001.Checked := false; N192001.Checked := false; N560001.Checked := true; Comm.BaudRate := br1200; StatusBar1.Panels[1].Text := '56000'; end; procedure TFrmUpdate.COM21Click(Sender: TObject); begin COM11.Checked := false; COM21.Checked := true; Comm.DeviceName := 'Com2'; StatusBar1.Panels[2].Text := 'COM2'; end;

45

procedure TFrmUpdate.COM11Click(Sender: TObject); begin COM11.Checked := true; COM21.Checked := false; StatusBar1.Panels[2].Text := 'COM1'; Comm.DeviceName := 'Com1'; end; procedure TFrmUpdate.CommError(Sender: TObject; Errors: Integer); begin if (Errors and CE_BREAK > 0) then showmessage('The hardware detected a break condition.'); if (Errors and CE_DNS > 0) then showmessage('Windows 95 only: A parallel device is not selected.'); if (Errors and CE_FRAME > 0) then showmessage('The hardware detected a framing error.'); if (Errors and CE_IOE > 0) then showmessage('An I/O error occurred during communications with the device.'); if (Errors and CE_MODE > 0) then begin showmessage('The requested mode is not supported, or the hFile parameter'); showmessage('is invalid. If this value is specified, it is the only valid error.'); end; if (Errors and CE_OOP > 0) then showmessage('Windows 95 only: A parallel device signaled that it is out of paper.'); if (Errors and CE_OVERRUN > 0) then showmessage('A character-buffer overrun has occurred. The next character is lost.'); if (Errors and CE_PTO > 0) then showmessage('Windows 95 only: A time-out occurred on a parallel device.'); if (Errors and CE_RXOVER > 0) then showmessage('An input buffer overflow has occurred.'); if (Errors and CE_RXPARITY > 0) then

46

showmessage('The hardware detected a parity error.'); if (Errors and CE_TXFULL > 0) then showmessage('The application tried to transmit a character.'); end; procedure TFrmUpdate.CommRxBuf(Sender: TObject; Data: PVaData; Count: Integer); var I: integer; begin if cbcrc.Checked = false then begin for I := 0 to Count - 1 do begin case Data^[I] of #10:; #13: MMRx.Lines.Add(''); else MMRx.Lines.Text := MMRx.Lines.Text + Data^[I]; end; FindXY(Data^[I]); //divide valor recebido UpdateGrafic(strtoint(robox),strtoint(roboy)); UpdateMySQL(robox,roboy); //Atualiza valores no banco de dados end; end {FIM DO CBCRC = FALSE ================================================================ = ======= INICIO DO CBCRC = TRUE =============== ======= TESTE PARA SABER SE O CRC VIR SEPARADO =============== ================================================================ =} else if Unido1.Checked = false then

47

begin case first of 1: begin for I := 0 to Count - 1 do begin first := 2; LineDataCRC := ord(Data^[I]); end; end; 2: begin for I := 0 to Count - 1 do begin first := 1; LineDataCRC := (ord(Data^[I]) shl 8) + LineDataCRC; end; //Teste para saber se houve erro na transmissao... if TesteCrc(LineDataCRC) = 0 then begin LineDataCRC := (LineDataCRC and $FF00) shr 8; FindXY(chr(LineDataCRC)); //divide valor recebido UpdateGrafic(strtoint(robox),strtoint(roboy)); UpdateMySQL(robox,roboy); //Atualiza valores no banco de dados case chr(LineDataCRC) of #0, #10:; #13: begin LineData := ''; MmRx.Lines.Add(chr(LineDataCRC)); end; #27: begin //"ESC" //Retransmissao do ultimo byte Count := Comm.WriteBuf(send, 2); if Count = 0 then MmRx.Lines.add('Erro ao enviar na porta: ' + Comm.DeviceName);

48

end; else MmRx.Lines.Text := MmRx.Lines.Text + chr(LineDataCRC); end; //Fim do case end //Fim do teste de CRC = 0 else //Se CRC 0 begin inc(Erro); //Transmissao da mensagem "ESC" com CRC para pedir retransmissao Comm.PurgeWrite; send := ($1B shl 8); //Transmite "ESC" Count := Comm.WriteBuf(send, 1); if Count = 0 then MmRx.Lines.add('Erro ao enviar na porta: ' + Comm.DeviceName) else begin Comm.PurgeWrite; send := CRC(chr($1B)); //Transmite "CRC" Count := Comm.WriteBuf(send, 1); if end; end; //Fim do teste se CRC 0 end; //Fim do first = 2 end; //Fim do case end //Fim Unido1.Checked = false {=========================================================== ===========TESTE PARA SABER DE CRC VIR JUNTO ============ ============================================================} else begin for I := 0 to Count - 2 do begin LineDataCRC := (ord(Data^[I+1]) shl 8) + ord(Data^[I]); end; Count = 0 then MmRx.Lines.add('Erro ao enviar na porta: ' + Comm.DeviceName);

49

//Teste para saber se houve erro na transmissao... if TesteCrc(LineDataCRC) = 0 then begin LineDataCRC := (LineDataCRC and $FF00) shr 8; FindXY(chr(LineDataCRC)); //divide valor recebido UpdateGrafic(strtoint(robox),strtoint(roboy)); UpdateMySQL(robox,roboy); //Atualiza valores no banco de dados case chr(LineDataCRC) of #0, #10:; #13: begin LineData := ''; MmRx.Lines.Add(chr(LineDataCRC)); end; #27: begin //"ESC" //Retransmissao do ultimo byte Count := Comm.WriteBuf(send, 2); if Count = 0 then MmRx.Lines.add('Erro ao enviar na porta: ' + Comm.DeviceName); end; else MmRx.Lines.Text := MmRx.Lines.Text + chr(LineDataCRC); end; //Fim do case end //Fim do teste de CRC = 0 else //Se CRC 0 begin inc(Erro); //Transmissao da mensagem "ESC" com CRC para pedir retransmissao send := ($1B shl 8) + CRC(chr($1B)); if Comm.WriteBuf(send,2) = 0 then MmRx.Lines.add('Erro ao enviar na porta: ' + Comm.DeviceName); end; //Fim do teste se CRC 0 end; //Fim do else Comm.PurgeRead; //Limpa buffer de leitura end;

50

procedure TFrmUpdate.cbcrcClick(Sender: TObject); begin if cbcrc.Checked = false then Pacote.Enabled := false else Pacote.Enabled := true; end; procedure TFrmUpdate.Unido1Click(Sender: TObject); begin Unido1.Checked := true; Separado1.Checked := false; end; procedure TFrmUpdate.Separado1Click(Sender: TObject); begin Unido1.Checked := false; Separado1.Checked := true; end; procedure UpdateGrafic(x,y: integer); begin FrmGrafic.image1.Canvas.Font.Size := 5; if iniciar = true then begin count := 0; FrmGrafic.image1.Canvas.MoveTo(200 + x,200 + y); FrmGrafic.image1.Canvas.TextOut(204+x,204+y,concat(inttostr(count))); iniciar := false; end else begin FrmGrafic.Image1.Canvas.LineTo(200 + 15*x,200 + 15*y); FrmGrafic.image1.Canvas.TextOut(200+15*x,200+15*y,concat(inttostr(count)));

51

end; FrmGrafic.Image1.Canvas.Refresh; inc(count); end;

procedure TFrmUpdate.ToolButton4Click(Sender: TObject); begin FrmGrafic.showmodal; end; end.