Comunicação Serial Motivação • Diversos dispositivos eletrônicos usam portas seriais para se comunicar com outros dispositivos eletrônicos. • Para muitos é a única forma de comunicação. • A integração de equipamentos antigos aos sistemas automatizados muitas vezes pode ser resumida à “inclusão” destes dispositivos simples nas redes de comunicação. Comunicação Serial – RS232 Padrão RS232C: – Criado em 1969 – Implementações atuais não suportam o padrão original completo. – Os sinais implementados atualmente e sua forma de utilização são muito pouco semelhantes à especificação original. – O estudo apenas do padrão, sem levar em conta a “evolução” (darwiniana) das implementações, seria infrutífero. 1 Comunicação Serial – RS232 UART (Universal Asynchronous Receiver Transmitter): – Componente essencial nos subsistemas de comunicação serial de dispositivos. – Pega bytes de dados e transmite os bits, individualmente, de forma sequêncial. – No destino, um outro UART remonta os bits em bytes. – Trabalham com nível de tensão TTL (Transistor to Transistor Logic), ou seja, 5V. Comunicação Serial – Sincrona x Assincrona • Comunicação Serial Sincrona: – Transmissor e receptor devem utilizar um “clock” compartilhado: • Além do sinal de dados, o transmissor deve enviar um sinal de strobe para que o receptor saiba quando ler o próximo bit de dados. – Mais eficiente – Mais cara: circuitos e cabeamento para compartilhamento de clock. 2 Comunicação Serial – Sincrona x Assincrona • Comunicação Serial Assincrona: – Transmissão de dados sem utilização de sinal de clock. – Bits especiais são adicionados aos dados para sincronizar o transmissor e o receptor: • Start Bit: Adicionado ao início da “word” que será transmitida. Usado para sincronizar clocks do receptor e do transmissor. (drift máximo entre clocks de 10%). • Bit de dados: os bits da word de dados são enviados, com o Bit menos significativo antes (LSB). A sinalização de cada bit é realizada em período constante, e o receptor lê (amostra) o meio físico no meio deste período. – Ex: T =2s, receptor lê o sinal (0 ou 1), depois de 1 segundo e vai aguardar mais 2 segundo para realizar nova leitura. • Bit de paridade: o transmissor adiciona este bit depois de enviar toda a palavra de dados. O receptor pode utilizar este bit para verificar erros. • Stop Bit: o transmissor envia pelo menos um bit de parada. Comunicação Serial – Sincrona x Assincrona • Comunicação Serial Assincrona: – O receptor, ao receber toda o pacote de bits (Start Bit, Data Bits, Parity Bit, Stop Bit): • Pode verificar o bit de paridade (previamente configurado entre transmissor e receptor – paridade par, impar ou nenhuma). • Deve verificar o Stop Bit, se não o encontrar, então houve um erro de transmissão e o UART deve avisar que ocorreu um “Framing Error”, isto é, há um problema de sincronia entre transmissor e receptor. • O UART receptor descarta os bits de controle (Start, Paridade, Stop) e envia ao microcontrolador host apenas os dados/palavra. 3 Comunicação Serial – RS 232 - Sinalização • Sinalização por tensão: – Nível lógico 0: +3V até +25V (Space) – Nível lógico 1: -3V até –25V (Mark) • Voltage Pump (TTL até níveis RS232): – Transceivers: Ex: MAX232 (Dalsemi): +5V +10V e –5V –10V Comunicação Serial – RS 232C - Equipamentos • Segundo o padrão, dois equipamentos: – DCE (Data Communication Equipment). Exemplo: modem – DTE (Data Terminal Equipment). Exemplo: PC Normalmente trabalhamos com DTE. 4 Comunicação Serial – RS 232C – Pinagem DB9 Pinagem do conector serial DB-9 DTE: Pino Sinal Sentido Descrição 1 CD (Carrier Detect) Entrada DCE avisa quando receve sinal de que dados estão a caminho 2 RD (Receive Data) Entrada Recebe dados enviados pelo DCE 3 TD (Transmit Data) Saída Transmite dados para o DCE 4 DTR (Data Terminal Ready) Saída DTE avisa quando está pronto para comunicar 5 Signal Ground 6 DSR (Data Set Ready) Entrada DCE avisa quando conseguiu estabelecer canal de comunicação 7 RTS (Request to Send) Saída DTE pede permissão para enviar dados 8 CTS (Clear to Send) Entrada DCE permite que DTE envie dados 9 RI (Ring Indicator) Entrada DCE avisa que telefone está tocando Comunicação Serial – Conexão DTE -DTE • Padrão especifica conexão DTE – DCE. Computador DTE Modem DCE Modem DCE Computador DTE RS232 – cabo direto Linha discada • Não são raros os casos em que precisamos realizar conexões DTE-DTE. – Utilizamos um cabo “null modem” Computador DTE Computador DTE 5 Comunicação Serial – Cabo Null Modem Pino Sinal 1 CD (Carrier Detect) 2 RD (Receive Data) 3 TD (Transmit Data) 4 DTR (Data Terminal Ready) 5 Signal Ground 6 DSR (Data Set Ready) 7 RTS (Request to Send) 8 CTS (Clear to Send) 9 RI (Ring Indicator) Comunicação Serial – Interface de Loopback Pino Sinal 1 CD (Carrier Detect) 2 RD (Receive Data) 3 TD (Transmit Data) 4 DTR (Data Terminal Ready) 5 Signal Ground 6 DSR (Data Set Ready) 7 RTS (Request to Send) 8 CTS (Clear to Send) 9 RI (Ring Indicator) 6 Comunicação Serial – Java Pacote de Comunicação: javax.comm Metodos: CommPort •Configuração de portas •Obter streams para leitura e escrita de dados SerialPort Comunicação Serial – Java Classe CommPortIdentifier Possui um método estático sobrecarregado que devolve um objeto da classe CommPortIdentifier: public static CommPortIdentifier getPortIdentifier(String portName) throws NoSuchPortException public static CommPortIdentifier getPortIdentifier(CommPort port) throws NoSuchPortException 7 Comunicação Serial – Java Classe CommPortIdentifier Possui um método estático que devolve uma enumeração de portas: public static Enumeration getPortIdentifiers() import java.util.Enumeration; import javax.comm.CommPortIdentifier; class PortLister{ public static void main(String args[]){ Enumeration ports = CommPortIdentifier.getPortIdentifiers(); while (ports.hasMoreElements()){ System.out.println(((CommPortIdentifier)(ports.nextElement())).getName()); } } } Comunicação Serial – Java Classe CommPortIdentifier Possui um método que devolve uma CommPort: public synchronized CommPort open(String appname,int timeout) throws PortInUseException Chamada ao método é bloqueada, isto é, o método somente retorna quando: – Consegue acesso exclusivo à porta devolve a CommPort requisitada. – Quando o tempo (timeout – ms) expira PortInUseException. Para utilizar uma porta serial, devemos realizar um cast: SerialPort sp; sp=(SerialPort)CommPortIdentifier.getCommPortIdentifier(“com1”.)open (“App”,1000); Para liberar a porta, devemos chamar: sp.close() 8 Comunicação Serial – Java Configuração da Porta Serial (SerialPort) Possui um método para configuração de: – Baud rate: {1200,2400,...,9600,...,19200,...,38400,...,115200} – Número de DataBits SerialPort.{DATABITS_5,DATABITS_6,DATABITS_7,DATABITS_8} – Número de StopBits SerialPort.{STOPBITS_1,STOPBITS_1_5,STOPBITS_2} – Tipo de paridade: SerialPort.{PARITY_EVEN,PARITY_MARK,PARITY_NONE,PARITY_ODD,PARITY_SPACE} public void setSerialPortParams(int baudrate, int dataBits, int stopBits, int parity) throws UnsupportedCommOperationException Comunicação Serial – Java Configuração da Porta Serial (SerialPort) Controle de Fluxo (handshake) – Mecanismo que permite que o receptor interrompa o envio de dados pelo transmissor quando seu buffer de entrada estiver próximo de sua capacidade máxima (evita perda de dados por overflow do buffer) – Modos de controle de fluxo: • None (sem controle de fluxo, terminais enviam dados quando assim o desejarem) • RTS/CTS (hardware flow control) • XON/XOFF (software flow control) 9 Comunicação Serial – Java Configuração da Porta Serial (SerialPort) Controle de Fluxo: XON/XOFF B A Dados Envia caracter XOFF (0x13) Para de enviar dados Envia caracter XON (0x11) Continua a enviar dados Buffer de recepção quase cheio Processa dados e esvazia buffer de recepção Dados Vantagem: Controla overflow e utiliza apenas linhas 2(RD), 3(TD) e 5(GND) Desvantagem: os caracteres 0x11 e 0x13 precisam de tratamento especial para serem enviados, quando fazem parte dos dados. Comunicação Serial – Java Configuração da Porta Serial (SerialPort) Controle de Fluxo: RTS/CTS B A 1.Deseja enviar dados RTS = 1 2.Pronto para receber CTS = 1 3.Envia dados enquanto CTS = 1 Dados 4.Buffer de recepção quase cheio CTS = 0 5.Para de enviar dados 6.Pronto para receber CTS = 1 7.Envia dados enquanto CTS = 1 Dados Vantagem: Controla overflow sem interferir nos dados Desvantagem: Utiliza linhas 2(RD)/3(TD), 5(GND) e 7(RTS)/8(CTS) 10 Comunicação Serial – Java Configuração da Porta Serial (SerialPort) Possui um método para configuração de Controle de Fluxo: – Tipo de controle de fluxo: SerialPort.{FLOWCONTROL_NONE,FLOWCONTROL_ RTSCTS_IN,FLOWCONTROL_ RTSCTS_OUT,FLOWCONTROL_ XONXOFF_IN,FLOWCONTROL_ XONXOFF_OUT} public void setFlowControlMode(int flowcontrol) throws UnsupportedCommOperationException public int getFlowControlMode() 11