Javacomm + Porta Serial + Windows XP = Erro

Pessoal,

tudo bem?

Bem, estou tentando fazer uma rotina para ler a porta serial do pc no Windows XP mas não estou conseguindo.

Bem, acontece que quando mando listar ele lista COM1 e COM3; ótimo, lista OK.

No gerenciador de dispositivos aparece a COM1 como a porta serial disponível e meu modem está ligado à COM3.

Na hora que eu vou tentar abrir a porta serial ele dá o erro:

O código eu baseei em um exemplo da sun, disponível em http://java.sun.com/developer/releases/javacomm/SimpleRead.java

E meu código vem a seguir:

import javax.comm.*;
import java.util.Enumeration;
import java.util.TooManyListenersException;
import java.io.InputStream;
import java.io.IOException;

public class LeSerial implements Runnable,SerialPortEventListener //evento para ler a porta serial
{ 
 static SerialPort serialPort;
 static CommPortIdentifier portId;
 InputStream inputStream;  
 Enumeration portList;

 public LeSerial()
 {

  try
  {
   portId = CommPortIdentifier.getPortIdentifier("COM1");
  }
  catch(NoSuchPortException e)
  {
   System.out.println("Porta não encontrada : COM1 \n");
   e.printStackTrace();
  }

  try
  {
   serialPort = (SerialPort)portId.open("LeSerial",2000); //nome da aplicação que abre a porta e timeout
  }
  catch(PortInUseException e)
  {
   System.out.println("A porta COM1 está em uso!");
   e.printStackTrace();
   :arrow: Está entrando aqui!
  }
  
  try
  {
   inputStream = serialPort.getInputStream();
  }
  catch(IOException e)
  {
   e.printStackTrace();
  }
  
  try
  {
   serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);   
  }
  catch(UnsupportedCommOperationException e)
  {
   e.printStackTrace();
  }
  
  try
  {
   serialPort.addEventListener(this);
  }
  catch(TooManyListenersException e)
  {
   System.out.println("Listener cheio");
  }
  
  serialPort.notifyOnDataAvailable(true); //acorda o sleep da thread.
  
  Thread threadLeitura = new Thread(this);
  threadLeitura.start();
 }  
 
 
 public static void main(String[] args) 
 {
  LeSerial leSerial = new LeSerial();
 }
 
 public void run()
 {
  try
  {

   Thread.sleep(10000); //dormir por 10 segundos

  }
  catch(InterruptedException e)
  {
    System.out.println("acordou forçado");
  }
 }
 
 public void serialEvent(SerialPortEvent event)
 {
  if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE)
  {
   byte[] readBuffer = new byte[20];
   try
   {
    while (inputStream.available()>0)
    {
     int numBytes = inputStream.read(readBuffer);
    }
    System.out.println(new String(readBuffer));
   }
   catch(IOException e)
   {
    System.out.println("Erro de leitura da porta!");
    e.printStackTrace();
   }
  }
 }
}  

O meu caso é o seguinte:

Estou tentando fazer um palm comunicar via IR com um modem externo (pegasus III) de um pc.

Pergunta: O Windows barra a leitura da porta serial??
Pergunta2: Alguma sugestão para fazer isso melhor?

Obrigado.

Vou fazer aquela famosa perguntinha - por acaso você está com algum outro programa, tal como o Conduit do Palm (não sei se esse é o nome certo), ou o Microsoft ActiveSync, se você tiver um PocketPC também, tentando acessar a porta serial também?

Que eu saiba, o javax.comm da Sun funciona direitinho (se você seguir as instruções em jdk1.2.html ), no Windows 2000, Windows 98, Windows ME, Windows 2003 e no Windows XP - eu testei em todos esses ambientes, com um usuário do grupo Administradores, e sei que funciona. (Só tive de copiar o win32com.dll para \windows\system32 ou \winnt\system32, para evitar alguns problemas de PATH, e o comm.jar em jre\lib\ext).

Esse javax.comm da Sun funciona até com Microsoft JVM e com applets assinados (mas com um pouco de esforço é óbvio).

Dê uma olhada com o PortMon ( http://www.sysinternals.com ) para ver se não tem nada que já capturou a porta serial COM1.

thingol olha que interessante:

Desde o princípio eu desligava o HotSync Manager pra ter certeza que ninguem estava acessando a porta.

Nada.

Aí eu fui tentar deixar o HotSync Manager ligado pra poder testar qualé que era.

A opção Port Serial do Hot Sync estava desabilitada e, quando eu fui haibilitar:

Eu ainda estou por entender… Ainda não consultei a lista do site que vc passou mas vou olhar. E estou pensando tb em hardware mal conectado dentro do gabinete, pode ser?

Meus cabelos já tão todos em cima da mesa… :?

Ps.: Win XP + SP2

Olha, se você tiver um micro moderno (Pentium 4 / Athlon XP), normalmente só há 1 porta serial, que é impossível estar desconectada por estar presa à placa-mãe (pode estar queimada, mas aí são outros 500).

Veja se realmente não há nenhum programa chato que esteja tentando pegar a porta serial.
(Pegue o Gerenciador de Tarefas e vá matando todos os processos que você não conhece.
Por exemplo, para modens Lucent/Agere, existe um programa AG_____ (não lembro o nome direito) que fica pegando a porta do modem e vê se não há ninguém tentando se conectar ao modem (ligação “entrante”, como alguém tentando ligar para você para passar um fax, por exemplo).

Use o velho e bom Hyperterminal (acessórios -> comunicações -> Hyperterminal), e veja se a porta COM1 está disponível.

VIVAAAAAAAAAA

Resolvi a parada!!! Aehhhhh… Fenomenal!!!

Thingol, o lance era o seguinte:

Um belo dia eu tinha tentado instalar o modem pegasus III conforme o pdf ensina. Não deu certo. O pdf é de 1900 e vovó gostosa.
Após me lembrar disso fui no gerenciador de dispositivos e matei o componente “Porta Infra Vermelho” ou algo parecido.

Ainda não funcionava.

Desativei a porta COM1 e nada.

Desinstalei a porta COM1, dei uns 300 boot, instalei novamente e então passou a funcionar!!!

Mas até eu conseguir resolver isso eu já tinha matado todos os processos da máquina. Matava e testava a porta. E nenhum dava certo. Nessa brincadeira eu reiniciei minha máquina umas 8000 vezes, pois sempre matava um processo do sistema sem saber…

:arrow: Agora a porta tá funcionando OK, só falta eu conseguir comunicar o palm com o pc pelo modem infravermelho. Pra isso alguma sugestão?
Eu escrevi na porta IR do palm (OK) e tentei ler na porta serial do pc, que é a porta que está ligado o modem (not OK).

Vou procurar na net sobre este modem pra saber como é feita sua instalação, dessa vez sem interromper o funcionamento da porta COM1.

O modem Pegasus III está ligado à porta Serial e apenas lendo a serial eu pude supor que iria ler os dados. Me enganei.

Alguma sugestão???

Obrigado.