Interface Serial - Apostila

16
Periféricos - José Alexandre J. Ribeiro 1 INTERFACE SERIAL A comunicação serial de dados tornou-se tão popular, que um grupo de fabricantes e companhias telefônicas, em meados de 1960, formaram a Associação de Indústrias Eletrônicas (EIA) para concordarem sobre as formas padronizadas de se enviar e receber dados. O padrão que se tornou mais usado é chamado de RS-232C. As portas seriais geralmente utilizam conectores de 25 pinos ou conectores de 9 pinos, chamados de “conectores do tipo D”e muitas vezes referenciados como DB-9 ou DB25. Uma porta serial transmite bits individuais um após os outros sobre uma conexão simples (2 fios basicamente). Devido a essa característica a velocidade de transmissão, em relação a comunicação paralela, se torna um incoveniente (baixa). Dentro do micro os dados estão paralelos, estes são convertidos em serial (placa serial) e mandados para fora do micro um após o outro. No outro lado, na recepção, os dados são convertidos de serial (placa serial) para paralelo (dentro do micro). Geralmente neste tipo de padrão usamos a transmissão padrão (assíncrona) mostrada abaixo: Observações: * Os dispositivos seriais se dividem em duas categorias: DCE (Data Communication Equipament) que são os Modems entre outros dispositivos. E temos o DTE (Data Terminal Equipament) que são os Terminais ou computadores; * O padrão de comunicação é o RS232C, que especifica que o conector DTE deve ser do tipo macho, e o conector DCE do tipo fêmea. No passado usava-se muito o conector DB-25, porém hoje em dia usam-se mais o DB-9. As tensões são: # Lógica alta : -3V a -15V (com carga) e -25V (sem carga, no máximo) # Lógica baixa : +3V a +15V (com carga) e +25V (sem carga, no máximo) # A região entre -3V e +3VC é indefinida # A corrente da porta não deve exceder os 500mA Os sinais gerados no PC são de -12V para nível lógico 1 e de +12V para nível lógico 0. SINAIS DO RS-232C Abaixo nos temos seus pinos e seus respectivos nomes: Start Bit 5, 6, 7 ou 8 bits de dados Bit de paridade 1, 1.5 ou 2 Stop Bits LSB MSB

Transcript of Interface Serial - Apostila

Page 1: Interface Serial - Apostila

Periféricos - José Alexandre J. Ribeiro

1

INTERFACE SERIAL

A comunicação serial de dados tornou-se tão popular, que um grupo de fabricantes e companhias

telefônicas, em meados de 1960, formaram a Associação de Indústrias Eletrônicas (EIA) para concordarem

sobre as formas padronizadas de se enviar e receber dados. O padrão que se tornou mais usado é chamado de

RS-232C.

As portas seriais geralmente utilizam conectores de 25 pinos ou conectores de 9 pinos, chamados de

“conectores do tipo D”e muitas vezes referenciados como DB-9 ou DB25.

Uma porta serial transmite bits individuais um após os outros sobre uma conexão simples (2 fios

basicamente). Devido a essa característica a velocidade de transmissão, em relação a comunicação paralela,

se torna um incoveniente (baixa).

Dentro do micro os dados estão paralelos, estes são convertidos em serial (placa serial) e mandados

para fora do micro um após o outro. No outro lado, na recepção, os dados são convertidos de serial (placa

serial) para paralelo (dentro do micro).

Geralmente neste tipo de padrão usamos a transmissão padrão (assíncrona) mostrada abaixo:

Observações:

* Os dispositivos seriais se dividem em duas categorias: DCE (Data Communication Equipament)

que são os Modems entre outros dispositivos. E temos o DTE (Data Terminal Equipament) que são os

Terminais ou computadores;

* O padrão de comunicação é o RS232C, que especifica que o conector DTE deve ser do tipo macho,

e o conector DCE do tipo fêmea. No passado usava-se muito o conector DB-25, porém hoje em dia usam-se

mais o DB-9.

As tensões são: # Lógica alta : -3V a -15V (com carga) e -25V (sem carga, no máximo)

# Lógica baixa : +3V a +15V (com carga) e +25V (sem carga, no máximo)

# A região entre -3V e +3VC é indefinida

# A corrente da porta não deve exceder os 500mA

Os sinais gerados no PC são de -12V para nível lógico 1 e de +12V para nível lógico 0.

SINAIS DO RS-232C

Abaixo nos temos seus pinos e seus respectivos nomes:

Start Bit 5, 6, 7 ou 8 bits de dados

Bit de paridade

1, 1.5 ou 2 Stop Bits LSB MSB

Page 2: Interface Serial - Apostila

Periféricos - José Alexandre J. Ribeiro

2

Conector de 25 Pinos Conector de 9 Pinos Abreviaçao Nome

2 3 TD Transmit Data

3 2 RD Receive Data

4 7 RTS Request To Send

5 8 CTS Clear To Send

6 6 DSR Data Set Ready

7 5 SG Signal Ground

8 1 CD Carrier Detect

20 4 DTR Data Terminal Ready

22 9 RI Ring Indicator

Abaixo temos a descrição de cada pino:

TXD (Transmissão de dados): Por esse pino é feita a transmissão de dados do computador para o periférico.

Desta maneira, no caso de ligação direta (micro/impressora; mouse/micro, etc.), esse pino deverá ser ligado

ao sinal do RXD do periférico. No caso de transmissão sem protocolo (não utiliza sinais para indicar

chegada dos dados, erros, etc.), essa linha poderá ser dispensada quando tivermos um periférico de entrada

comunicando com o computador (não há necessidade do computador responder a alguma solicitação,

exemplo: a maioria dos mouse).

RXD (Recepção de dados): É por essa linha que o computador recebe os dados do periférico. Ela portanto

deve ser ligada a saída TXD do periférico.

CTS (Limpa - autorização, livre - para enviar): É pino usado para controle de fluxo (handshaking). Este pino

é normalmente utilizado nas ligações remotas (modem). Indica que o modem esta OK para trocar dados. Em

ligações diretas (sem modem), este sinal é dispensável ou então poderá ser ligado ao próprio RTS do micro.

RTS (Requisição - solicitação - de envio): É um pino usado para controle de fluxo (handshaking). É por essa

linha que o computador (UART) informa que está disponível para receber ou transmitir dados (o RTS

deverá ser sempre ativado antes de cada transmissão). Normalmente este pino será interligado ao pino CTS

do periférico. No caso de transmissão com protocolo, este sinal somente será usado caso o periférico seja

conectado a um MODEM.

Page 3: Interface Serial - Apostila

Periféricos - José Alexandre J. Ribeiro

3

DTR (Data Terminal ready - Terminal esta pronto): É um pino usado em controle de fluxo (handshaking). É

o contrário do pino DSR. É um Sinal que indica que o terminal (micro/UART) está pronto para iniciar troca

de informações. Este sinal tem comportamento análogo ao sinal RTS, permanecendo em nível 1 quando a

transmissão se dá através de protocolos.

DCD (Data Carrie Detec - Detecção do transportador de dados): Sinal de detecção do sinal de portadora -

Linha telefônica esta ativa (carrier), no caso de ligação com MODEM (se não tiver o MODEM não há por

que usar este pino).

DSR (Data System Ready): É usado em controle de fluxo (handshaking). Sinal que indica sistema

(modem/micro) esta pronto (micro ligado, etc). Geralmente é ligado ao DTR do micro ou impressora.

GND ou SG: Sinal de terra (referência) da transmissão

UMA COMUNICAÇÃO SIMPLES

Quando um periférico somente transmite e outro somente recebe, a comunicação necessita apenas de

dois sinais em cada equipamento: O TXD e SG (3 e 5) no que transmite (ex.: micro) e de RXD e SG (2 e 5)

no que recebe os dados (ex.: modem).

COMUNICAÇÃO NAS DUAS DIREÇÕES

Se cada um dos dois equipamentos interligados podem transmitir e/ou receber dados, no mínimo

temos 3 linhas de cada: TXD, RXD e SG.

As vezes é necessário controlar o fluxo de dados na transmissão, para isto deve-se usar então as

linhas DSR e DTR em cada equipamento. Se por acaso estas linhas de fluxo não forem suficiente,

deveremos usar então mais duas linhas extras em cada equipamento: RTS e CTS. Neste modo para se ter

uma comunicação serial nos dois sentidos com 2 linhas de handshaking deveremos ter em cada equipamento

7 linhas de comunicação.

Quando estamos usando MODEM podemos ter ainda mais duas linhas extras: a RI e DCD que

indicam: modem chamando e modem esta pronto (respectivamente). Estas linhas não são muito utilizadas

hoje em dia.

Geralmente em projetos eletrônicos conectados ao micro temos apenas a comunicação simples nas

duas direções sem controle de fluxo, estes devem ser ligados nos respectivos pinos do próprio micro.

Para tais ligações usamos um cabo chamado de Null modem, que é visto abaixo:

Page 4: Interface Serial - Apostila

Periféricos - José Alexandre J. Ribeiro

4

COMPORTAMENTO DOS SINAIS RTS e CTS NA LEITURA/ESCRITA DE DADOS

Nesta explicação usarei somente uma linha de handshaking (RTS, CTS), mas poderíamos usar mais

uma outra (DTR e DSR) simultaneamente. Onde RTS equivale a DTR e CTS equivale a DSR.

Tanto o RTS como o CTS deverão ser usados apenas quando temos algum tipo de protocolo na

comunicação. Este protocolo pode garantir uma precisão contra erros na transmissão ou na recepção. Abaixo

mostrarei um exemplo de como utilizá-los para uma transmissão ou recepção usando um protocolo simples:

ESCRITA

Ativa RTS; (coloca em nível lógico 1)

Espera CTS; (aguarda sinal do periférico, indicando que já pode mandar)

Envia 1º byte; (dado sendo transmitido)

Espera CTS; (aguarda confirmação do periférico para mandar o 2º byte)

Envia 2º byte; (depois de recebido o CTS, pode-se mandar o 2º byte)

Espera CTS; (aguarda confirmação do periférico para mandar outro dado)

Envia 3º byte; (depois de recebido um OK em CTS pode-se mandar o 3º byte)

Desativa RTS; (caso já tenha chegado no final da transmissão desative o RTS)

LEITURA

Ativa RTS; (indica que o micro esta pronto para receber o sinal)

Espera CTS; (aguarda confirmação de leitura - sinal válido)

Lê dado; (após ter recebido CTS deve-se ler os dados em RXD)

Desativa RTS; (se não tiver mais dados para receber então devemos desativar o RTS)

TIPOS DE LIGAÇÕES

DTE: Equipamento terminal de dado. Nestes equipamentos os dados chegam e ficam, não continuam como

no caso do modem. Ex.: Micro/Impressora.

DTE - DTE: Interface entre equipamento terminal de dados para equipamento terminal de dados.

DCE: Equipamento de comunicação de dados. Nesses equipamentos os dados chegam e continuam.

Exemplo: Modem.

DTE-DCE: Interface entre equipamento terminal de dados e equipamento de comunicação de dados.

Page 5: Interface Serial - Apostila

Periféricos - José Alexandre J. Ribeiro

5

Agora veremos os modelos de ligações dos conectores dos micros. Em cada tipo, temos ligação de 3

fios ( 3-wire) ou full conection. A ligação 3-wire é usada quando temos uma comunicação sem protocolo, ou

seja, o sinal é transmitido diretamente sem que haja controle de erros e verificações. A full conection é para

uma comunicação mais complexa, onde temos o uso de protocolos de verificação de status e erros.

LIGAÇÃO DTE-DTE

Abaixo temos uma ligação a 3 fios (micro-mouse):

A principio temos os dois conectores do tipo fêmea. No caso de uma ligação entre micro e mouse, o

conector da direita é ligado ao micro (macho) e o da direita não existe pois é interno ao mouse.

Abaixo temos a ligação full conection (micro-impressora):

A principio temos os dois conectores do tipo fêmea. Eles são fêmea pois nos DTEs o conector é

macho.

LIGAÇÃO DTE-DCE

Abaixo temos a ligação a 3 fios:

Page 6: Interface Serial - Apostila

Periféricos - José Alexandre J. Ribeiro

6

Neste tipo temos conector femea(conector que liga no micro)-macho(conector que liga no modem).

Abaixo temos a ligação full conection:

Neste tipo temos conector femea-macho.

Todos os exemplos acima foram utilizados coenctores DB25 fêmea ou macho. Abaixo temos uma

ilustração real do conector fêmea:

Se o conector for macho a numeração é invertida, ou seja:

Este desenho é do conector pelo lado interno (dentro do conector; é aqui que os fios serão soldados).

As ligações vistas anteriormente servem também para conectores do tipo DB9 (macho ou fêmea).

Neste caso a numeração vista anteriormente não irá bater, então abaixo temos os desenho do conector DB9

com os respectivos nomes de cada pino, observando estes nomes você poderá fazer as ligações anteriores

tranqüilamente. A figura abaixo é de um conector DB9 do tipo fêmea:

1 - DCD 6 - DSR 2 - RxD 7 - RTS 3 - TxD 8 - CTS 4 - DTR 9 - RI 5 - GND

Page 7: Interface Serial - Apostila

Periféricos - José Alexandre J. Ribeiro

7

Para o conector do tipo macho a numeração é invertida, ou seja:

Devemos lembrar novamente que este é o lado de dentro do conector, é onde os fios deverão ser

ligados.

As vezes é necessário fazer a conexão entre conectores diferentes, exemplo um DB25 com um DB9,

abaixo temos uma figura ilustrando esta ligação:

UARTS

Numa comunicação serial usamos um CI especial que transforma os sinais paralelos de dentro do

computador numa seqüência de pulsos seriais. Este CI é chamado de Universal Asynchronous

Receiver/Transmitter (Transmissor/Receptor Assícrono Universal), ou UART, este chip aceita 8 linhas de

dados paralela e possui uma saída serial.

Um CI muito utilizado no passado é o 8250 (usado em XT’s e alguns modem’s). Logo após (com a

vinda do AT) foi lançado o UART 16450, uma versão melhorada do 8250, mas ainda compatível com ele.

Depois veio o UART 16550, de alto desempenho.

Este chip deverá ser configurado antes de qualquer transmissão ou recepção. Os elementos de

configuração que devem ser considerados são os seguintes:

TAXA DE TRANSMISSÃO: É a velocidade de transmissão dos dados. Neste caso devemos

observar que os dois equipamentos devem estar com a mesma velocidade. Esta velocidade poderá ser de:

110, 150, 300, 600, 1200, 2400, 4800, 9600. Em alguns casos poderemos ter velocidades maiores.

NÚMERO DE BITS DE DADOS: É o número de bits que teremos num dado em questão. Este valor

pode ser de 5, 6, 7 ou 8 bits.

PARIDADE: O bit de paridade é usado como um simples esquema de detecção de erro. Pode ser

ímpar, par ou nenhuma, neste caso não é gerado o bit de paridade.

Page 8: Interface Serial - Apostila

Periféricos - José Alexandre J. Ribeiro

8

STOP BIT: O stop bit poderá ser configurado como 1, 1.5 ou 2 bits, sendo que na maioria das vezes

usa-se o 1 ou 2.

CONTROLE DE FLUXO (HANDSHAKING)

Para que a comunicação seja corretamente completada (sem erros) é necessário que os equipamentos

estejam na mesma velocidade, e com o mesmo tipo de protocolo de comunicação; caso contrário deverá

ocorrer algum erro de comunicação ou a comunicação não será completada.

A solução mais fácil é usar um fio especial como linha de sincronização, de modo que o sistema

receptor possa indicar que está pronto a receber os dados. Como este método exige um hardware modificado

- fio de controle de fluxo - ele é chamado de handshaking de hardware.

Alguns canais de comunicação não permitem o uso deste fio extra, exemplo a conexão telefônica.

Neste caso temos caracteres embutidos na transmissão de dados. Como estes caracteres de controle podem

ser acrescentados através de programação pelo sistema emissor, esse método costuma ser chamado de

handshaking de software.

Na maioria dos esquemas de controle por soft, o sistema receptor usa dois caracteres diferentes para

sinalizar quando está pronto para receber dados e quando não pode mais aceitar dados, pelo menos

temporariamente (XON/XOFF)

Para que o controle por soft seja eficiente é necessário que os aplicativos possuam estes métodos de

controle. Caso contrario devemos ter em mãos alguns drivers especiais.

AS PORTAS SERIAIS

As portas seriais são ligações existentes entre o computador e o mundo exterior. Geralmente no

micro temos duas portas seriais: COM1 e COM2. As portas são identificadas para os nossos softs através de

2 atributos: um endereço de hardware e uma linha de solicitação de interrupção (IRQ) atribuída à porta. O

endereço é a localização onde ficará armazenado o conteúdo dos registros da UART. A IRQ é a maneira de

conseguir a atenção do processador.

Os endereços para a COM1 e COM2 são padronizados.

Endereços das portas seriais:

PORTA IRQ ENDEREÇO

COM1 4 3F8h

COM2 3 2F8h

COM3 4 3E8

COM4 3 2E8

Page 9: Interface Serial - Apostila

Periféricos - José Alexandre J. Ribeiro

9

Abaixo temos um programa que retornará na tela as portas seriais que seu micro possui, bem como

seus respectivos endereços.

#include <stdio.h>

#include <dos.h>

void main(void)

{

unsigned int far *ptraddr; /* Pointer to location of Port Addresses */

unsigned int address; /* Address of Port */

int a;

ptraddr=(unsigned int far *)0x00000400;

for (a = 0; a < 4; a++)

{

address = *ptraddr;

if (address == 0)

printf("Port não encontrado em COM%d \n",a+1);

else

printf("Endereço associado a COM%d é o endereço %Xh\n",a+1);

*ptraddr++;

}

}

CONFIGURANDO UMA PORTA

Para fazer a comunicação de um micro com outro, devemos primeiro configurá-los de maneira que os

dois possuem a mesma configuração, caso contrário poderá não haver a comunicação. Para tanto podemos

usar o comando MODE do MS-DOS, caso for feita a configuração direta via soft deveremos configurar (no

soft) os mesmos parâmetros (do mode). Quando formos fazer um programa de comunicação deveremos

fazer a configuração de dentro do seu soft; em C deveremos usar a BIOSCOM ou _BIOS_SERIALCOM,

para maiores informações use o HELP do TC e preste bastante atenção!

Caso o seu programa não faça a configuração automática da porta você deverá fazer via DOS, através

do comando MODE, de maneira geral a configuração da porta é:

Page 10: Interface Serial - Apostila

Periféricos - José Alexandre J. Ribeiro

10

MODE COM_:Baud, Paridade, Bits de dados, Bits de fim

Sendo:

COM_: Nome da porta serial: COM1, COM2, COM3 ou COM4

Baud: Velocidade de transmissão - 110, 150, 300, 600, 1200, 2400, 4800, 9600

Paridade : Especifica o tipo de paridade da transmissão ou recepção - N (paridade neutra), O

(paridade ímpar), E (paridade par)

Bits de dados: Especifica o tamanho do byte a ser transmitido - 5,6, 7 ou 8 (mais usado 7 e 8)

Bits de parada (stop bit) : Especifica o número de stop bits da transmissão - 1 ou 2

Exemplo: C:\>MODE COM1:300,O,8,1

Neste caso estamos configurando a COM1 para 300 baud de velocidade, paridade ímpar, com 8 bits a

palavra e 1 stop bit. Lembre-se que quando a velocidade de transmissão for alta, poderemos ter problemas de

sincronismo e a comunicação acaba não sendo efetuada, por isso é de praxe que se coloque uma velocidade

menor de transmissão.

CONHECENDO OS REGISTRADORES SERIAIS

Abaixo temos uma tabale com os registrados que podem ser usados numa comunicação/controle

serial.

Endereço Bit DLAB Read/Write Abr. Nome do registrador

0 Write - Buffer de Transmissão

Base 0 Read - Buffer de Recepção

1 Read/Write - Parte Baixa do byte de velocidade

Base+1 0 Read/Write IER Interrupt Enable Register

1 Read/Write - Parte Alta do byte de velocidade

Base+2 - Read IIR Interruption Identification Register

- Write FCR Fifo Control Register

Base+3 - Read/Write LCR Line Control Register

Base+4 - Read/Write MCR Modem Control Register

Base+5 - Read LSR Line Status Register

Base+6 - Read MSR Modem Status Register

Base+7 - Read/Write - Scratch Register

Page 11: Interface Serial - Apostila

Periféricos - José Alexandre J. Ribeiro

11

Os registradores mais usados são o Base, Base+1, Base+3 e Base+5. O registrador Base é usado para

Transmitir ou receber dados, o Base, o Base+1 e Base+3 é usado para configurar a porta e o Base+5 é o

status da porta, ou seja, é nele que vou verificar se chegou dado ou não.

Para que se possa fazer um programa transmitir/receber, devemos primeiro configurar ambos

equipamentos para a mesma configuração. Caso um deles estejam com configuração errada, a comunicação

não será feita. Configurar a porta será ajustar a velocidade, no. de bits de dados, bit de paridade e quantida

de stop bit.

Abaixo, então, temos a seqüência usada para fazer um programa de comunicação serial usando

liguagem C e outport’s (podemos usar outros métodos, porém este acho o mais viável).

Configuração da Porta: Deve-se configurar 4 itens:

• Velocidade

• Paridade

• Nº de Bits da palavra de dado

• Nº de Stop Bit

Para configurar a velocidade devemos primeiro setar o BIT 7 em 1 no registrador LCR. Este

registrador é acessado pelo endereço base + 3. Por exemplo: Endereço Base = 3F8, então para acessar o

LCR devemos fazer Base + 3 = 3F8 + 3 = 3FB.

Deveremos então mandar para 3FB o dado 80h, isto irá setar em 1 o Bit 7 do 3FB. Vejamos:

80h = 1000 0000, pelo Debug faríamos: - O 3FB,80. Isto irá idicar ao micro que agora iremos configurar

velocidade.

A velocidade é dividida em dois registradores de 8 Bits (total de 16 Bits), sendo um chamado de

parte Baixa e outro chamado de parte Alta. A parte alta da velocidade deverá ser colocada no endereço

base+1 e a parte baixa no endereço base. o Cálculo da velocidade será:

TxBaud

=115200

Sendo o Baud a velocidade a ser transmitida (1200, 2400, 4800, 9600, etc...)

Por exemplo:

Tx C= = ⇒ ⇒115200

960012 0012 00010 16

Parte Baixa

Parte Alta

Page 12: Interface Serial - Apostila

Periféricos - José Alexandre J. Ribeiro

12

Deveremos então mandar para 3F9h o valor 00h e para 3F8h o valor 0Ch, pelo Debug faríamos:

- O 3FB,80 Indica que vamos configurar a velocidade

- O 3F8,0C Parte baixa da velocidade

- O 3F9,00 Parte alta da velocidade

Para uma velocidade de 300 baud, teremos em 3F8h o dado 80h e em 3F9h o dado 01h.

Abaixo temos uma tabela que você poderá usar para facilitar o cálculo de acordo com a velocidade:

Velocidade (bps) Divisor (Dec) Parte Alta da vel. Parte Baixa da vel.

50 2304 09h 00h

300 384 01h 80h

600 192 00h C0h

2400 48 00h 30h

4800 24 00h 18h

9600 12 00h 0Ch

19200 6 00h 06h

38400 3 00h 03h

57600 2 00h 02h

115200 1 00h 01h

Depois de configurado a velocidade, devemos configurar o resto. Para tanto usamos o endereço

Base+3, que é o Registrado LCR, abaixo temos a descrição de cada bit deste registrador.

D7 D6 D5 D4 D3 D2 D1 D0

Neste dois Bits defino

a tamanho da palavra

Nº de Stop Bits

Habilita a paridade: 0 - Sem paridade

1 - Com paridade

Habilita a paridade par (em 1) e em 0 paridade ímpar

Stick Parity (mantém o Bit de paridade sempre em 1 ou 0)

Habilita o sinal de Break

Habilita o divisor de Baud-Rate (velocidade)

O Tamanho da palavra é definido assim:

D1 D0

00 0 5 Bits

0 1 6 Bits

Page 13: Interface Serial - Apostila

Periféricos - José Alexandre J. Ribeiro

13

1 0 7 Bits

1 1 8 Bits

O Nº de Stop Bit é definido assim:

D2

0 1 Stop Bit

1 2 Stop Bit

Com a configuração definida, consigo montar a palavra que deverá ser mandada para 3FB. Por

exemplo: Seja uma comunicação onde temos 6 Bits de dados, 2 stop Bit e paridade par. Desenhando de uma

forma melhor teremos:

D7 D6 D5 D4 D3 D2 D1 D0

0 0 0 1 1 1 0 1

Transformando esta seqüência de Bits para hexa temos: 1Dh. Devemos então mandar para 3FBh o

dado 1Dh. Pelo debug teríamos:

- O 3FB,1D

Exemplo Completo: Configure a porta COM1 para uma velocidade de 1200 baud, com 8 Bits de

dados, 2 Stop Bit e sem paridade.

Tx = = = =115200

120096 1100000 006010 2 16

A parte alta da velocidade é: 00h e a parte baixa é 60h

Formando a configuração da transmissão teremos:

D7 D6 D5 D4 D3 D2 D1 D0

0 0 0 0 0 1 1 1

Transformando a seqüência de Bits para Hexa, teremos: 07h

Pelo debug a configuração seria:

6 Bits de dados

2 Stop Bit

Habilita a paridade

Indica que a paridade é par

Na grande maioria das

vezes ficam em zero

(D5 e D6)

Indica que não vou configurar a

velocidade

Page 14: Interface Serial - Apostila

Periféricos - José Alexandre J. Ribeiro

14

- O 3FB,80 Indica que vai haver configuração da velocidade

- O 3F8,60 Parte baixa da velocidade

- O 3F9,00 Parte alta da velocidade

- O 3FB,07 Configuração da porta por LCR

Pela linguagem C teremos:

# include <dos.h>

void main()

{

outport(0x3fb,0x80);

outport(0x3f8,0x60);

outport(0x3f9,0x00);

outport(0x3fb,0x07);

}

Mandando um dado para a porta (Transmissão do dado): Basta colocar na porta o respectivo dado. Vamos

supor que você queira mandar a letra “A” do micro 1 para o micro 2. Vejamos:

A = 41h, a porta COM1 possui endereço 3F8, então:

Pelo debug seria:

- O 3F8, 41

Pela linguagem C seria:

# include <dos.h>

void main()

{

outport(0x3f8,0x41);

}

Recebendo um dado da porta (Recepção do dado): Para receber um dado basta dar um IMPORT no endereço

base (3F8) e guardar este dado numa variável e depois exibir o dado. Veja que neste caso não estou

verificando o status da porta (endereço base + 5) e poderá acontecer de lermos algum dado e este não ser

Page 15: Interface Serial - Apostila

Periféricos - José Alexandre J. Ribeiro

15

verdadeiro e sim lixo ! Então antes de lermos no endereço base, deveremos primeiro ler o status da porta

(Base+5) e verificar se chegou algum dado, se for verdadeiro, é que iremos ler o dado no endereço base,

caso for falso não poderemos ler.

Para acessar o registrador de status iremos usar o endereço base + 5, ou seja, 3F8 + 5, o que resulta

em 3fdh. A função dos Bits é mostrada abaixo:

D7 D6 D5 D4 D3 D2 D1 D0

Dado

recebido

1: Sim

0 : Não

Erro Overrun: Chegou

outro dado na porta

sem termos lido ela

antes. (dado anterior

foi perdido)

Erro de paridade: Erro ocorrido na

recepção de dados (erro de

paridade)

Erro de framing: O caracter recebido não tem

Stop Bit.

Sinal Break recebido: Os Bits recebidos são maiores dos

que selecionados

Buffer de transmissão vazio: O caracter já foi mandado e a UART já

pode mandar outro para transmissão

Registrador de conversão Paralelo/Serial esta vazio e esta pronto para receber outro

dado interno para virar serial

Sempre deverá estar em zero.

Na verdade o único BIT que deveremos observar é o Bit D0, pois indica se um dado foi recebido ou

não. Os outros são usados para controle de erros.

Podemos concluir que só deveremos ler um dado na porta base se antes verificarmos o BIT 0 do

endereço Base+5: * Se for 1 → Devemos ler o endereço base

* Se for 0 → Não devemos ler o endereço base

Programa exemplo para configuração da porta e veirifcação do status da porta:

Page 16: Interface Serial - Apostila

Periféricos - José Alexandre J. Ribeiro

16

#include <dos.h> #include <string.h> int x, porta; void main() { outport(0x3fb,0x80); outport(0x3f8,0x60); outport(0x3f9,0x00); outport(0x3fb,0x07); clrscr(); porta=0x3fd; x=inport(porta); printf("\n O valor recebido na porta %x e' de %x",porta,x); getch(); }

Programa exemplo para configuração da porta e recebimento de dado na porta COM1:

#include <dos.h> #include <string.h> int x, porta; void main() { outport(0x3fb,0x80); outport(0x3f8,0x60); outport(0x3f9,0x00); outport(0x3fb,0x07); clrscr(); porta=0x3f8; x=inport(porta); printf("\n O valor recebido na porta %x e' de %x",porta,x); getch(); }