pmr2300_comucomunicação serial

15
1 Comunicação Serial – Java Configuração da Porta Serial Abre porta serial: SerialPort sp; String PortID = “com1”; String AppName = “Aplicacao Jtest”; int timeOut = 1000; sp=(SerialPort)CommPortIdentifier.getPortIdentifier(PortID).open(AppName, timeOut); Configura Porta Serial: sp.setSerialPortParams(115200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); sp.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); Comunicação Serial – Java Enviando Dados Obtem stream de saída de uma porta serial: OutputStream os = sp.getOutputStream(); Prepara dados para envio: Byte[] arranjoBytes = new Byte[20]; arranjoBytes[0]= 0x0f; arranjoBytes[1]= 0xef; .... arranjoBytes[19]= 0x00; Envia dados: os.write(arranjoBytes,0,arranjoBytes.length); os.flush(); os.close();

Upload: william-moretti

Post on 06-Dec-2015

242 views

Category:

Documents


0 download

DESCRIPTION

Como fazer comunicação através da porta serial

TRANSCRIPT

Page 1: PMR2300_Comucomunicação Serial

1

Comunicação Serial – Java Configuração da Porta Serial

Abre porta serial:SerialPort sp;

String PortID = “com1”;

String AppName = “Aplicacao Jtest”;

int timeOut = 1000;

sp=(SerialPort)CommPortIdentifier.getPortIdentifier (PortID).open(AppName,

timeOut);

Configura Porta Serial:sp.setSerialPortParams(115200,

SerialPort.DATABITS_8,

SerialPort.STOPBITS_1,

SerialPort.PARITY_NONE);

sp.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);

Comunicação Serial – Java Enviando Dados

Obtem stream de saída de uma porta serial:OutputStream os = sp.getOutputStream();

Prepara dados para envio:Byte[] arranjoBytes = new Byte[20];

arranjoBytes[0]= 0x0f;

arranjoBytes[1]= 0xef; ....

arranjoBytes[19]= 0x00;

Envia dados:os.write(arranjoBytes,0,arranjoBytes.length);

os.flush();

os.close();

Page 2: PMR2300_Comucomunicação Serial

2

Comunicação Serial – Java Recebendo Dados

• Para receber dados através de uma porta serial devemos tratar eventos da porta serial.

• Para tanto a nossa classe deve implementar a interface :SerialPortEventListener

public class JTest implements SerialPortEventListen er {

....

}

• Devemos também “registrar” a porta serial para que seus eventos sejam monitorados:

sp.addEventListener(this);

• Devemos habilitar a notificação quando há dados no buffer de recepçãosp.notifyOnDataAvailable(true);

Comunicação Serial – Java Recebendo Dados

• Na ocorrência de um evento da porta serial, a função de callback serialEvent(SerialPortEvent spe) é chamada.

• O código da tarefa que trata os dados recebidos devem ser inseridos nesta função.

public void serialEvent(SerialPortEvent serialPortE vent) {

...

}

Page 3: PMR2300_Comucomunicação Serial

3

Comunicação Serial – Java o Método serialEvent

• Obter a stream de entrada da porta serial:

InputStream is = sp.getInputStream();

• Procurar pelo evento de chegada de dados:

switch(serialPortEvent.getEventType()){

case SerialPortEvent.DATA_AVAILABLE:

System.out.println("PL: DataAvailable");

//recebe dados

break;

default:

}

Comunicação Serial – Java o Método serialEvent

• Recebe dados:

Byte [] readBuffer = new Byte[300];

int numBytes;

if(is.available()>0)

numBytes = is.read(readBuffer);

System.out.println("Bytes Received:" + numBytes);

is.close();

Page 4: PMR2300_Comucomunicação Serial

4

Comunicação Serial – Java Encerrando educadamente

Ao terminar o uso de uma porta de comunicação devemos encerrar sua utilização removendo o listener e fechando a porta.

try{

sp.removeEventListener();

sp.close();

}catch (Exception e){}

RS232 Apenas a camada física...

• Como podemos observar, o padrão RS232 define apenas a camada física do modelo OSI:

– Sinalização (sinal de tensão)

– Conexão física (cabos e conectores)

– Codificação para sincronização (bits adicionais)

– Handshake– Baudrate

Page 5: PMR2300_Comucomunicação Serial

5

MODBUS

• Protocolo de Aplicação (camada 7 do modelo OSI)• Criado em 1979 pela Modicon.• Master-slave/Client-server• Padrão aberto largamente difundido (protocolo muito simples)

– >7Milhões de dispositivos ModBus.

• Aplicação:– Monitoração e programação de dispositivos.– Comunicação entre dispositivos inteligentes, sensores e atuadores.– Monitoração de equipamentos de campo por PCs e HMIs.

MODBUS

• MODBUS é um protocolo posicionado na camada 7 do modelo OSI

• MODBUS é um protocolo de requisição/resposta e oferece serviços especificados por function codes.

• Pode ser utilizado com:– TCP/IP em Ethernet.– Transmissões seriais assíncronas:

• cabos : EIA/TIA-232-E , EIA- 422, EIA/TIA-485-A; • Fibra optica• RF

Page 6: PMR2300_Comucomunicação Serial

6

MODBUS Mensagem

•Function Code: apenas um byte (1-255)

•Data: tamanho variável

•Additional address: server address (1 byte) (RS232)

•Error check: 2 bytes (Cyclic Redundancy Check)

MODBUS Troca de mensagens bem sucedida

Page 7: PMR2300_Comucomunicação Serial

7

MODBUS Troca de mensagens com erro

MODBUS Representação de dados - BigEndian

• Dados de 16 bits são compostos por 2 bytes, sendo que o mais significativo é sempre enviado antes (BigEndian):

• Primeiro enviamos o primeiro byte: 0xFE

• Depois enviamos o segundo byte: 0xAB

0xFEAB16 bits

ValorRegistrador

Page 8: PMR2300_Comucomunicação Serial

8

MODBUS Modelo de Dados

MODBUS Dispositivo ModBus Típico

Page 9: PMR2300_Comucomunicação Serial

9

MODBUS Funções básicas

MODBUS Funções básicas – Read Coils (0x01)

Page 10: PMR2300_Comucomunicação Serial

10

MODBUS Funções básicas – Read Discrete Inputs (0x02)

MODBUS Funções básicas – Read Holding Registers (0x03)

Page 11: PMR2300_Comucomunicação Serial

11

MODBUS Funções básicas – Read Input Register (0x04)

MODBUS Funções básicas – Write Single Coil (0x05)

Page 12: PMR2300_Comucomunicação Serial

12

MODBUS Funções básicas – Write Single Register (0x06)

MODBUS RTU

• Utiliza RS232/485 (camada física)• ModBus (camada de aplicação)• Define a camada de enlace (camada 2 do modelo OSI):

– Endereçamento– Verificação de erros

ModBus

ModBus-RTU

Page 13: PMR2300_Comucomunicação Serial

13

MODBUS RTU – RS232

MODBUS RTU – CRC

• Dispositivo que envia a mensagem gera e envia 2 bytes de CRC.• Dispositivo que recebe a mensagem, gera 2 bytes de CRC a partir da

mensagem recebida e verifica se é igual aos bytes de CRC enviados.• O CRC16 é o resto da divisão dos bytes da mensagem por um polinômio

de ordem 16, logo, o resultado deve ter ordem no máximo 15, ou seja, 16 elementos.

• O polinômio utilizado é: 1 + X2 + X15 + X16

Bytes que entram no cálculo do CRC

Page 14: PMR2300_Comucomunicação Serial

14

MODBUS RTU – Gerando CRC16

1. Carrega em um registrador de 16 bits o valor 0xFFFF2. Realiza um XOR com o primeiro byte da mensagem e guarda no registrador3. Faz um shift de um bit para a direita, preenchendo o espaço aberto com 0.4. Se o bit “descartado” for 0 volta para o passo 3, senão:

– Realiza um XOR do registrador de CRC com o valor 0xA001

5. Repete passos 3 e 4 até que 8 deslocamentos tenham sido realizados

6. Repete passos 2 até 5 para o próximo byte da mensagem. Continuar até que todos os bytes da mensagem sejam processados.

7. O conteúdo final do registrador é o valor do CRC

MODBUS RTU – Gerando CRC (0x02 0x07)

Page 15: PMR2300_Comucomunicação Serial

15

MODBUS RTU – Gerando CRC (0x02 0x07)