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

Propaganda
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();
1
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 SerialPortEventListener {
....
}
• 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ção
sp.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 serialPortEvent) {
...
}
2
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();
3
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
4
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
5
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
6
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):
Registrador
16 bits
Valor
0xFEAB
• Primeiro enviamos o primeiro byte: 0xFE
• Depois enviamos o segundo byte: 0xAB
7
MODBUS
Modelo de Dados
MODBUS
Dispositivo ModBus Típico
8
MODBUS
Funções básicas
MODBUS
Funções básicas – Read Coils (0x01)
9
MODBUS
Funções básicas – Read Discrete Inputs (0x02)
MODBUS
Funções básicas – Read Holding Registers (0x03)
10
MODBUS
Funções básicas – Read Input Register (0x04)
MODBUS
Funções básicas – Write Single Coil (0x05)
11
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
12
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
13
MODBUS RTU – Gerando CRC16
1.
2.
3.
4.
Carrega em um registrador de 16 bits o valor 0xFFFF
Realiza um XOR com o primeiro byte da mensagem e guarda no registrador
Faz um shift de um bit para a direita, preenchendo o espaço aberto com 0.
Se o bit “descartado” for 0 volta para o passo 3, senão:
–
5.
6.
7.
Realiza um XOR do registrador de CRC com o valor 0xA001
Repete passos 3 e 4 até que 8 deslocamentos tenham sido realizados
Repete passos 2 até 5 para o próximo byte da mensagem. Continuar até que
todos os bytes da mensagem sejam processados.
O conteúdo final do registrador é o valor do CRC
MODBUS RTU – Gerando CRC (0x02 0x07)
14
MODBUS RTU – Gerando CRC (0x02 0x07)
15
Download