Escolar Documentos
Profissional Documentos
Cultura Documentos
SUMÁRIO
INTRODUÇÃO....................................................................................................................04
DESENVOLVIMENTO......................................................................................................05
Códigos em Bloco ........................................................................................................05
Largura de Hamming ...................................................................................................05
Distância Hamming......................................................................................................05
Códigos Cíclicos...........................................................................................................06
Mensagens CRC (Códigos de Redundância Cíclica)...................................................07
Escolha de um Polinômio.............................................................................................08
Erros de Bit Simples............................................................................................08
Erros de Dois Bits (Erros Duplos).......................................................................09
Erros com um Número Impar de Bits..................................................................09
Erros em Rajada...................................................................................................09
Vantagens das Técnicas CRC para as Técnicas de Somatório Simples.......................10
Algoritmos para calculo de CRC..................................................................................10
Algoritmos de Tabela de Busca...........................................................................12
Algoritmo padrão de Tabela de Busca.................................................................12
Algoritmo reduzido de Tabela de Busca..............................................................13
Estratégias de Correção de Erro...................................................................................14
Implementação.............................................................................................................15
Justificativas........................................................................................................17
MySQL.........................................................................................................................24
Instalação e Implementação................................................................................25
PHP...............................................................................................................................26
Instalação e Implementação................................................................................26
Apache...........................................................................................................................31
Instalação e Configuração...................................................................................31
CONCLUSÃO......................................................................................................................33
REFERÊNCIAS...................................................................................................................34
APÊNDICE..........................................................................................................................35
3
RESUMO
ABSTRACT
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 – Introdução
02- Desenvolvimento
Códigos em Bloco
Largura de Hamming
Distância Hamming
Códigos Cíclicos
Códigos cíclicos são uma importante classe dos códigos lineares. Estes códigos
possuem uma estrutura algébrica muito interessante que é bem adequada para
implementação e construção de muitas subclasses de códigos. Existem códigos cíclicos
eficientes para detecção/correção de múltiplos erros randômicos, erros de byte e erros em
rajada. Esses códigos podem ser implementados eficientemente por circuitos de
registradores de deslocamento de realimentação linear (LFSR) para codificação e
decodificação serial.
Um código linear C é dito código cíclico se, para qualquer vetor de código u =
(u0, ..., u n-1 ) ∈ C, o vetor u` = ( u n-1 , u0 , ..., u n-2 ) obtido pelo deslocamento dos
componentes para a direita ciclicamente é também um vetor de código em C.
Um deslocamento cíclico para a direita de n do vetor (u0, ..., u n-1 ) é ( u n-1 , u0 ,
..., u n-2 ) o qual é denotado por u(1). Mas genericamente denotamos um deslocamento
cíclico para a direita de i posições de u ou u(x) por ui ou ui(x).
Por esta definição, qualquer deslocamento cíclico por j posições para esquerda
(ou direita) de um vetor de código será também um vetor de código.
Para rotações cíclicas o coeficiente que deveria ser de xn é, ao invés disso,
usado como o coeficiente de x0 = 1. Portanto, a rotação cíclica à direita difere do produto
com x por um múltiplo de xn – 1. Este fato é apresentado formalmente pelo seguinte
teorema:
Escolha de um Polinômio
Erros em Rajada
1. CRC ← 0
2. Desloque a mensagem para a esquerda de W bits (Mensagem XOR W)
3. Enquanto (mais bits da mensagem) faça passos 4 e 5
4. Desloque o CRC para a esquerda por um bit, adicionando o próximo bit da
mensagem no bit menos significativo
5. Se (um bit “pulou” do registrador durante o passo 4) então
CRC ← CRC XOR Polinômio
Implementação
A figura 05 mostra o circuito impresso das placas para teste. Este circuito já foi
projetado para permitir a conexão dos módulos TX2 e RX2.
• Polinômio 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 retransmissão caso seja identificado alguma mensagem com erro.
Justificativas:
que 19600 bps) e que a quantidade de mensagens enviadas também seria baixa, podendo
assim ser usado o algoritmo “bitwise”(CRCB).
O desenvolvimento de um programa para geração e verificação de códigos
CRC foi realizado com o auxilio da ferramenta Delphi devido aos seguintes fatos:
O programa trabalha com mensagens de 8 bits e gera para estas um código CRC
também com 8 bits.
O programa trabalha com a mensagem da seguinte forma:
Os primeiros três bits da mensagem representam a distância percorrida pelo
robô na posição “x” (em centímetros).
O quarto bit da mensagem é responsável por determinar o sentido do
deslocamento na posição “x”. Se este bit for zero, houve um deslocamento no sentido
positivo do eixo “x”, caso contrário, houve um deslocamento no sentido negativo do eixo
“x”.
Do quinto ao sétimo bit são usados para representar o deslocamento do robô na
direção “y” (em centímetros).
O oitavo bit da mensagem é responsável por determinar o sentido do
deslocamento na posição “y”. Se este bit for zero, houve um deslocamento no sentido
positivo do eixo “y”, caso contrário, houve um deslocamento no sentido negativo do eixo
“y”.
A figura abaixo representa a mensagem com suas divisões.
Sy Y Y Y Sx X X X
Para testes do componente para comunicação serial (Async32) que utiliza a API
do windows, conectou-se dois computadores com o uso de um cabo db9-db9 cruzado com
as seguintes características:
• Pinagem:
MySQL
Instalação e Implementação
A tabela Robô foi criada na base de dados test (base de dados já existente no
servidor) com o seguinte comando SQL:
PHP
PHP é uma linguagem que permite criar sites WEB dinâmicos, possibilitando
uma interação com o usuário através de formulários, parâmetros da URL e links. A
diferença de PHP com relação a linguagens semelhantes a Javascript é que o código PHP é
executado no servidor, sendo enviado para o cliente apenas o html puro. Desta maneira é
possível interagir com bancos de dados e aplicações existentes no servidor, com a
vantagem de não expor o código fonte para o cliente. Isso pode ser útil quando o programa
está lidando com senhas ou qualquer tipo de informação confidencial.
Instalação e Implementação
;;;;;;;;;;;;;;;;;;;;;;;;;
; 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 ; 2 Meg default limit on file uploads
extension_dir=C:\PHP3 ./
;;;;;;;;;;;;;;;;;;;;;;
; 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
<html>
<head><title>Posicoes do Robo</title></head>
<body
BGCOLOR=black>
<font color=white font size=5>
<center>
<h2> Posicoes do Robo durante intervalos de tempo!</h2>
<?
// variáveis usadas na conexão ao DBMS
$host = "localhost";
$user = "root";
$pwd = "eletrica";
30
$base = "test";
$table = "Robo";
// estabelecer conexão com o DBMS
mysql_connect($host, $user, $pwd)
OR die ("Falhou na coneccao!!");
// selecionar uma base de dados
mysql_select_db( "$base")
OR die( "Falhou ao selecionar a base");
// construir a query
$query = "select * from $table";
// aplicar a query no DBMS
$result = mysql_query($query);
Apache
O Servidor Apache foi escolhido, pois apresenta as seguintes vantagens:
• Fácil implantação e administração;
• Permite criar sites usando domínios virtuais;
• Permite criação de sites dinâmicos usando CGIs ou linguagens como PHP;
• Permite criar sites protegidos por senhas;
• Implementação de acesso seguro (https);
• Alto nível de customização e confiabilidade;
• Implementação para páginas wap;
• Multi-plataforma (Windows, Linux, etc);
• Gratuito.
Instalação e Configuração
ServerName localhost
ScriptAlias /php3/ "c:/php3/"
AddType application/x-httpd-php3 .php3 .php
Action application/x-httpd-php3 "/php3/php.exe"
CONCLUSÃO
Este trabalho buscou fornecer uma discussão de algumas das técnicas mais
usadas para detecção e correção de erros em mensagens recebidas, além de exemplificar
através de algoritmos e programas as técnicas escolhidas.
Este trabalho também teve por finalidade demonstrar uma técnica de
disponibilizar as informações recebidas para uma posterior utilização das mesmas. Para
esta demonstração, utilizou-se da linguagem PHP, do banco de dados servidor MYSQL e
do servidor de HTTP APACHE.
Os resultados obtidos na implementação foram satisfatórios, provando a
vantagem da técnica CRC para detecção de erros e provando também que é possível
implementar o controle de um robô autônomo via rádio 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 módulos
TX2 e RX2 na implementação, o uso da Sindrome para correção das mensagens recebidas
com erros ao invés de pedir retransmissão das mesmas, um método em Java para atualizar
a página sempre que houver alteração e a união com o projeto final “Robô Autônomo para
Mapeamento de Ambientes” desenvolvido pelos alunos Jorge Humberto e Renato Alves
Borges.
35
REFERÊNCIAS
APÊNDICE
unit 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;
end;
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;
end;
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 Count = 0 then MmRx.Lines.add('Erro ao enviar na porta: ' +
Comm.DeviceName);
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;
49
end;
FrmGrafic.Image1.Canvas.Refresh;
inc(count);
end;
end.