O documento descreve a comunicação serial em Unix usando linguagem C. Ele explica como abrir e configurar portas seriais, escrever e ler dados, e fornece detalhes sobre o padrão RS-232 e a estrutura usada para configurar as opções da porta serial.
Comunicação Serial
Transferência deum bit por vez
Usada em dispositivos de rede, teclados,
mouse, MODEMs e terminais
Velocidade de transmissão expressa em bps
(bits-por-segundo) ou “baud-rate”
Padrão RS-232:
Padrão elétrico definido pela EIA (Eletronic
Industries Association)
Existem 3 categorias: A, B e C, sendo RS-232C
a mais usada
Rômulo C. Silva
3.
RS-232
DTE (Data TerminalEquipment):
equipamento que faz o processamento dos
sinais.
DCE (Data Circuit-terminating Equipment modem ): equipamento que faz a conexão
Um cabo de conexão entre dispositivos DTE
e DCE contém ligações em paralelo, não
necessitando mudanças na conexão de
pinos.
Rômulo C. Silva
RS-232
Sinal
Significado
SG ou GND
Terra
TDou TX
Tranmissão de dados
RD ou RX
Recepção de dados
DTR
Terminal de dados pronto
DSR
Conjunto de dados pronto
RTS
Pronto p/ enviar (computador)
CTS
Envie os dados (modem)
DCD
Portadora detectada
RI
Indicador de telefone tocando
FG
Frame Ground
Rômulo C. Silva
RS-232
Os sinais detemporização de transmissão e
recepção são utilizados somente quando o
protocolo de transmissão utilizado for
síncrono.
Para protocolos assíncronos, padrão 8 bits,
os sinais de temporização externos são
desnecessários.
Rômulo C. Silva
9.
Etapas da ComunicaçãoSerial
Abertura da porta de comunicação
Configuração da porta
Transmissão de dados
Recepção de dados
Rômulo C. Silva
10.
Comunicação Serial emUnix
Como todos os dispositivos, a porta serial é
tratada como um arquivo (diretório padrão
/dev)
Rômulo C. Silva
11.
Abertura da PortaSerial
fd = open(arquivoPorta, flags);
Função retorna um file descriptor que
permite o acesso à porta.
Flags:
O_NOCTTY : programa não será um terminal
controlador da porta. Evita que o processo seja
afetado por interrupção via teclado.
O_NDELAY : programa não irá cuidar da linha do
sinal DCD. Evita que o processo seja colocado
para “dormir” até haja sinal na linha DCD
O_RDWR : porta será aberta para leitura e
gravação
Rômulo C. Silva
12.
Abertura da PortaSerial em Unix
#include
#include
#include
#include
#include
#include
<stdio.h> /* Standard input/output definitions */
<string.h> /* String function definitions */
<unistd.h> /* UNIX standard function definitions */
<fcntl.h> /* File control definitions */
<errno.h> /* Error number definitions */
<termios.h> /*POSIX terminal control definitions */
/* * 'open_port()' - Open serial port 1. * * Returns the
file descriptor on success or -1 on error. */
int open_port(void) {
int fd; /* File descriptor for
fd = open("/dev/ttyS0", O_RDWR
O_NDELAY);
if (fd == -1) { /* * Could not
perror("open_port: Unable to
}
else fcntl(fd, F_SETFL, 0);
return (fd);
}
the port */
| O_NOCTTY |
open the port. */
open /dev/ttyS0 - ");
Rômulo C. Silva
13.
Escrever na PortaSerial
Uso da chamada de sistema write:
n = write(fd, "ATZr", 4);
if (n < 0)
fputs("write() of 4 bytes failed!n", stderr);
Rômulo C. Silva
14.
Leitura de dadosda Porta Serial
Uso da chamada de sistema read
Retorna a quantidade de bytes disponíveis
no buffer da porta serial
Se não há bytes disponíveis, o programa
fica bloqueado até haja dados disponíveis
O comportamento da função read pode ser
alterado para retornar imediatamente
quando não houver dados através da
chamada:
fcntl(fd, F_SETFL, FNDELAY);
P/ restaurar o comportamento de read:
fcntl(fd, F_SETFL, 0);
Rômulo C. Silva
15.
Leitura da PortaSerial
n=read(fd, buf, 5); /*tenta 5 bytes colocando
na variável buf */
if(n < 0) {
perror(“Sem dadosn”);
}
Rômulo C. Silva
16.
Fechar a portaSerial
Chamda de sistema close.
close(fd);
Rômulo C. Silva
17.
Configuração da PortaSerial
No arquivo <termios.h> encontra-se
definida uma estrutura (struct) que guarda
informações de configuração da porta serial
As funções tcgetattr e tcsetattr permite
ler e atribuir uma configuração à porta
serial, respectivamente
Rômulo C. Silva
Configuração da PortaSerial
Em difentes SOs, a taxa de transmissão e
recepção (baud-rate) é armazenada em
locais diferentes.
As funções cfsetospeed e cfsetispeed
permitem configurar a taxas de
transmissão e recepção, independente do
SO.
Rômulo C. Silva
20.
Configuração da PortaSerial
struct termios options;
/* * Get the current options for the port... */
tcgetattr(fd, &options);
/* * Set the baud rates to 19200... */
cfsetispeed(&options, B19200);
cfsetospeed(&options, B19200);
/* * Enable the receiver and set local mode... */
options.c_cflag |= (CLOCAL | CREAD);
/* * Set the new options for the port... */
tcsetattr(fd, TCSANOW, &options);
Rômulo C. Silva