Comunicação Serial
em Unix usando
linguagem C
Prof. Rômulo Silva

Abr/2008
Rômulo C. Silva
Comunicação Serial
Transferência de um 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
RS-232
DTE (Data Terminal Equipment):
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-232C

Rômulo C. Silva
RS-232
Sinal

Significado

SG ou GND

Terra

TD ou 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 C

Rômulo C. Silva
RS-232
Especifica um conector de 9 ou 25 pinos

Rômulo C. Silva
RS-232
Os sinais de temporizaçã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
Etapas da Comunicação Serial
Abertura da porta de comunicação
Configuração da porta
Transmissão de dados
Recepção de dados

Rômulo C. Silva
Comunicação Serial em Unix
Como todos os dispositivos, a porta serial é
tratada como um arquivo (diretório padrão
/dev)

Rômulo C. Silva
Abertura da Porta Serial
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
Abertura da Porta Serial 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
Escrever na Porta Serial
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
Leitura de dados da 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
Leitura da Porta Serial
n=read(fd, buf, 5); /*tenta 5 bytes colocando
na variável buf */
if(n < 0) {
perror(“Sem dadosn”);
}

Rômulo C. Silva
Fechar a porta Serial
Chamda de sistema close.
close(fd);

Rômulo C. Silva
Configuração da Porta Serial
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 Porta Serial –
struct termios

Rômulo C. Silva
Configuração da Porta Serial
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
Configuração da Porta Serial
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
Configuração da Porta Serial
Flags para função tcsetattr:

Rômulo C. Silva

Comunicação Serial Linux

  • 1.
    Comunicação Serial em Unixusando linguagem C Prof. Rômulo Silva Abr/2008 Rômulo C. Silva
  • 2.
    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
  • 4.
  • 5.
    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
  • 6.
  • 7.
    RS-232 Especifica um conectorde 9 ou 25 pinos Rômulo C. Silva
  • 8.
    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
  • 18.
    Configuração da PortaSerial – struct termios Rômulo C. Silva
  • 19.
    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
  • 21.
    Configuração da PortaSerial Flags para função tcsetattr: Rômulo C. Silva