Estou tendo um probleminha na porta de comunicação serial…
Eu consigo listar as portas, só q naum consigo fazer um open
cp = CommPortIdentifier.getPortIdentifier(Porta); // Pega o id da porta
porta = (SerialPort) cp.open("PortSerial", timeout); // abre a porta
nesta segunda linha q esta acontecendo um erro, como segue abaixo:
javax.comm.PortInUseException: Port currently owned by Unknown Windows Application
OBs.: estou pegando a lista de portas com esse comando
Enumeration portas= CommPortIdentifier.getPortIdentifiers();
Naum sei, mas estou achando q ele esta trazendo as portas que estao em uso já… gostaria de saber se tem como listar alguma porta sem uso??
acho q deve ser isso que esta causando erro…
Cara, tbm tive um monte de problemas com comunicação serial, peguei uma classe praticamente pronta aki numa apostilado guj e consegui fazer ela funcionar, segue o codigo:
//classe Principal
public class SComm implements Runnable, SerialPortEventListener {
//propriedades
private String Porta;
public String Dadoslidos;
public int nodeBytes;
private int baudrate;
private int timeout;
private CommPortIdentifier cp;
private SerialPort porta;
private OutputStream saida;
private InputStream entrada;
private String informacao;
private Thread threadLeitura;
//indicadores
private boolean IDPortaOK; //true porta EXISTE
private boolean PortaOK;// true porta aberta
private boolean Leitura;
private boolean Escrita;
private principal pri;
//construtor default paridade : par
//baudrate: 9600 bps stopbits: 2 COM 1
public SComm() {
//pri = new principal();
Porta = "COM1";
baudrate = 9600;
timeout = 1000;
//System.out.println("Entrei no construtor");
};
//um Objeto ComObj é passado ao construtor
//com detalhes de qual porta abrir
//e informações sobre configurações
public SComm( String p , int b , int t ){
this.Porta = p;
this.baudrate = b;
this.timeout = t;
};
//habilita escrita de dados
public void HabilitarEscrita(){
Escrita = true;
Leitura = false;
}
//habilita leitura de dados
public void HabilitarLeitura(){
Escrita = false;
Leitura = true;
}
//Obtém o ID da PORTA
public void ObterIdDaPorta(){
try {
cp = CommPortIdentifier.getPortIdentifier(Porta);
System.out.println(cp + " " + Porta);
if ( cp == null ) {
System.out.println("A " + Porta + " nao existe!" );
System.out.println("ERRO!Abortando..." );
IDPortaOK = false;
System.exit(1);
}
IDPortaOK = true;
} catch (Exception e) {
System.out.println("Erro durante o procedimento. STATUS: " + e );
IDPortaOK = false;
System.exit(1);
}
}
//Abre a comunicação da porta
public void AbrirPorta(){
try {
porta = (SerialPort)cp.open("SComm",timeout);
PortaOK = true;
System.out.println("Porta aberta com sucesso!");
//configurar parâmetros
porta.setSerialPortParams(baudrate,
porta.DATABITS_8,
porta.STOPBITS_2,
porta.PARITY_NONE);
} catch (Exception e) {
PortaOK = false;
System.out.println("Erro ao abrir a porta! STATUS: " + e );
System.exit(1);
}
}
//função que envie um bit para a porta serial
public void EnviarUmaString(String msg){
if (Escrita==true) {
try {
saida = porta.getOutputStream();
System.out.println("FLUXO OK!");
} catch (Exception e) {
System.out.println("Erro.STATUS: " + e );
}
try {
System.out.println("Enviando um byte para " + Porta );
System.out.println("Enviando : " + msg );
saida.write(msg.getBytes());
Thread.sleep(100);
saida.flush();
} catch (Exception e) {
System.out.println("Houve um erro durante o envio. ");
System.out.println("STATUS: " + e );
System.exit(1);
}
} else {
System.exit(1);
}
}
//leitura de dados na serial
public void LerDados(){
if (Leitura == true){
try {
entrada = porta.getInputStream();
System.out.println("FLUXO OK!");
} catch (Exception e) {
System.out.println("Erro.STATUS: " + e );
System.exit(1);
}
try {
porta.addEventListener(this);
System.out.println("SUCESSO. Porta aguardando...");
} catch (Exception e) {
System.out.println("Erro ao criar listener: ");
System.out.println("STATUS: " + e);
System.exit(1);
}
porta.notifyOnDataAvailable(true);
try {
threadLeitura = new Thread(this);
threadLeitura.start();
} catch (Exception e) {
System.out.println("Erro ao iniciar leitura: " + e );
}
}
}
//método RUN da thread de leitura
public void run(){
try {
Thread.sleep(2000);
} catch (Exception e) {
System.out.println("Erro. Status = " + e );
}
}
//gerenciador de eventos de leitura na serial
public void serialEvent(SerialPortEvent ev){
switch (ev.getEventType()) {
case SerialPortEvent.BI:
case SerialPortEvent.OE:
case SerialPortEvent.FE:
case SerialPortEvent.PE:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
case SerialPortEvent.DATA_AVAILABLE:
byte[] bufferLeitura = new byte[8];
try {
while ( entrada.available() > 0 ) {
nodeBytes = entrada.read(bufferLeitura);
}
String Dadoslidos = new String(bufferLeitura);
if (bufferLeitura.length == 0) {
System.out.println("Nada lido!");
} else if (bufferLeitura.length == 1 ){
System.out.println("Apenas um byte foi lido!");
} else {
System.out.println(Dadoslidos);
//System.out.println("Rafael " + Dadoslidos.substring(0,2));
if(Dadoslidos.substring(0,2).equals(new String("00"))){
System.out.println("entrei");
pri.atualizaInfo(Dadoslidos.substring(0,2), "velVento");
System.out.println("passei");
}
}
} catch (Exception e) {
System.out.println("Erro durante a leitura: " + e );
}
/*if(Dadoslidos.substring(1,3) == "dir"){
pri.atualizaInfo(Dadoslidos.substring(4,4), "dirVento");
}
if(Dadoslidos.substring(1,3) == "ven"){
pri.atualizaInfo(Dadoslidos.substring(4,5), "velVento");
}
if(Dadoslidos.substring(1,3) == "vel"){
//pri.atualizaInfo(Dadoslidos.substring(4,6), "velObjeto");
System.out.println("Entrei onde naum era pra entrar");
}*/
System.out.println("n.o de bytes lidos : " + nodeBytes );
break;
}
}
//função que fecha a conexão
public void FecharCom(){
try {
porta.close();
System.out.println("CONEXAO FECHADA>>FIM..");
} catch (Exception e) {
System.out.println("ERRO AO FECHAR. STATUS: " + e );
System.exit(0);
}
}
//Acessores
public String obterPorta(){
return Porta;
}
public int obterBaudrate(){
return baudrate;
}
Tou me iniciando nestas andanças de java e jcomm e ainda não domino muito
Tou tentando este seu exemplo mas ta ma dar erro:
"java.lang.NoSuchMethodError: main
Exception in thread “main” "
Acho k falta o main alguem me pode indicar um para este caso?? Please!!!
Muito Obrigado [/quote]
Realmente essa duvida eh bem basica
Quando vc coloca um programa pra rodar em java ele procura a main do arquivo, e esse ai nao tem main.
Pra resolver esse problema adicione no codigo esse fragmento, antes de fechar a ultima chave:
public static void main(String[] args) {
new SComm();
}
depois tem que ver se tem mesmo um dispositivo conectado na com1, senao nao vai funcionar.
[quote=BrunoNave]Ola!Tou testando esse exemplo e da me o seguinte erro:
“Scomm.java”: class SComm is public, should be declared in a file named SComm.java at line 23, column 1
k diz respeito a seguinte linha: " private principal pri;"
Alguem pode me ajudar?? Please[/quote]
em java a classe principal tem que ter o mesmo nome que o arquivo.
Se o nome do arquivo for MeuNome, o nome do arquivo q a contem deve ser MeuNome.java
Dá uma entrada aqui, tem muito coisa sobre comunicação serial utilizando a API RXTX: http://www.viamais.net/blog/index.php?s=rxtx.
Só um detalhe: a apostila do Guj é realmente excelente, contudo na leitura de alguns equipamentos o código postado lá quebra as strings causando certo transtorno. Os exemplos do blog que indiquei não dá esses problemas.