Vamos lá …
ClassPath
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import javax.comm.CommPortIdentifier;
import javax.comm.PortInUseException;
import javax.comm.SerialPort;
Sendo que javax.comm.* do pacote comm.jar. Constantes
static public final char STX=0x02; //inicio de um bloco de mensagem
static public final char ETX=0x03; //fim de um bloco de mensagem
static public final char EOT=0x04; //fim de uma troca de mensagem
static public final char ACK=0x06; //ack normal = ok
static public final char NAK=0x15; //não ack
static public final char FS=0x1C; //separador de campos da mensagem
static public final char GS=0x1D; //separador de campos da mensagem
static public final char US=0x1F; //separador de campos da mensagem
São hexas para controle de mensagens do protocolo de acordo com o manual do fabricante.
Váriaveis globais
[code]InputStream datain;
OutputStream dataout;
SerialPort porta;
public static final String nomePorta="/dev/ttyS0";
boolean encontrada=false;[/code]
“Acho” que vc tem que mudar o nomePorta para “com1:” (no windows eu não sei se tem dois-pontos ou não, tem que olhar no manual da api).
Método para aquisição da porta:
public SerialPort getPorta(String porta){
SerialPort serialPort=null;
CommPortIdentifier portId;
Enumeration portList;
//Obtem a lista de portas abaixo (no arquivo javax.comm.properties, vou falar depois)
portList = CommPortIdentifier.getPortIdentifiers();
while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();
//Pega só as portas seriais
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
//Esse cara aqui vê se a porta que ele encontrou é a que vc quer!!
if (portId.getName().equals(porta)) {
System.out.println("Found port " + porta);
encontrada = true;
try {
//SimpleWrite é o nome da aplicação e 2000 o timeout
serialPort =(SerialPort) portId.open("SimpleWrite", 2000);
} catch (PortInUseException e) {
System.out.println("Port in use.");
continue;
}
/* No linux temos que carregar o módulo serial_cs, se não esses parametrôs não funcionam
try {
serialPort.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e) {}
*/
try {
//Notificar quando o output está clean
serialPort.notifyOnOutputEmpty(true);
} catch (Exception e) {
System.out.println("Error setting event notification");
System.out.println(e.toString());
}
}
}
}
return serialPort;
}
Pegue a porta e os fluxos de in e out.
porta = getPorta(nomePorta);
try{
datain=porta.getInputStream();
dataout=porta.getOutputStream();
}catch(Exception e){
// Deu pau ao obter portas
e.printStackTrace();
}
Vou escrever uma mensagem no pinpad usando os [incio de um bloco de mensagem(STX)]+[comando(MK10)]+[Linha do display(2)]+[Mensagem(TESTE)]+[Fim do bloco de mensagem(ETX)]+[Fim de uma troca de mensagem(EOT)]
Traduzindo fica assim;
byte msg[]={STX, 'M','K','1','0','2','T','E','S','T','E',ETX,EOT};
Envie a mesagem pelo outputStream dataout assim:
dataout.write(msg);
No nosso dispositivo temos que analizar o primeiro byte que chega do device, se é ACK ou NAK. Primeiramente leia o cara:
//O buffer!!!
byte buff[] = new byte[100];
int lidos=0;
lidos=datain.read(buff);
teste:
if (lidos > 0 ){
if (buff[0]==NAK){
System.out.println("Deu pau!!");
}else if (buff[0]==ACK){
System.out.println("Festa!!!");
//tratamente da mensagem recebida
}
Após isso feche sempre a porta.
porta.close();
Fique atento para a velocidade, DATABITS, STOPBITS e paridade. Isso dá a uma dor de cabeça quando não estão com os parâmetros certos!!
Quando vc estiver desenvolvendo o device vai ficar ocupado quando tivar com o buffer != de vázio, desligar e ligar é sempre bom.
Boa sorte.
Shairon Toledo
http://formj.sourceforge.net