Api Java Serial Comm

9 respostas
T3rcio

Olá Pessoal,

Estou escrevendo um pequeno programa para comunicação serial em Java. Para isso estou utilizando a API Java Serial Comm, da Sun.
Instalei e configurei a API conforme as instruções do manual, na plataforma Linux. (Utilizo um Linux Mint - distro baseada no Ubuntu ).
O programa lista as portas existentes. Mas, ao tentar abrir qualquer um para a leitura/escrita de dados, a execução apresenta o seguinte erro:

Error opening “/dev/ttyS0”
tcgetattr(): Input/output error
at com.sun.comm.LinuxDriver.getCommPort(LinuxDriver.java:66)

Reconfigurei a API de acordo com este tópico, aqui mesmo do GUJ: http://www.guj.com.br/posts/list/28493.java#758917.
Pesquisando em outros sites, inclusive no próprio fórum da Sun, encontrei apenas respostas que me indicam o tratamento da exceção com a classe Exception, o que não resolve o problema.
Revisei os caminhos dos arquivos *.so – coloquei os arquivos no diretório “/usr/lib” do meu sistema; mas o erro continua. Achando que fosse algum erro de permissão, executei o arquivo como root, mas o erro persiste. =\

Alguém tem alguma ideia do que pode ser esse erro e como resolvê-lo?

9 Respostas

nieri

Cara eu não sei o que esta acontecendo, mas eu desenvolvi um
sistema de impressão e utilizei a API RXTXComm, muito boa
talves seja uma outra opção pra vc

M

Bem vindo ao fórum!

Você colocou o JAR, a biblioteca (*.so) e o arquivo de propriedades nos respectivos lugares?

E poste aqui:

  1. Seu arquivo de propriedades, como está atualmente
  2. A saída dos seguintes comandos: ls -al /dev/ttyS* e whoami
T3rcio

Sim. O arquivo libLinuxSerialParallel.so coloquei no diretório “/usr/lib” conforme o manual.
O arquivo *.jar ( comm.jar ) coloquei no diretório "/usr/java/jdk1.6.0_03/bin/lib e /usr/java/jdk1.6.0_03/jre/lib.

Meu arquivo javax.comm.properties:

javax.comm.properties (Solaris)

This properties file is necessary in order for javax.comm to run,

and its contents are critical, and not to be tampered with without

a very clear understanding of the impact. It is shipped with a

default set of values that work on the target platform.

1. The directory javax.comm is launched from

2. Each directory in the classpath (including the one in which comm.jar is in)

3. <jvm dir>/lib

4. <jvm dir>/jre/lib

The following properties must be defined:

driver

serpath0 … serpath<n>

parpath0 … parpath<n>

Driver:

The driver property specifies the fully qualified class name of the

platform specific implementation of the javax.comm.CommDriver class.

Format:

driver=<fully qualified classname>

Example:

driver=com.sun.comm.SolarisDriver

Port paths:

Port paths must be specified to indicate to the implementation

which are the core set of ports to make available. These can

be either paths to directories containing ports or paths to

specific serial or parallel ports.

Implementation specific driver

driver=com.sun.comm.LinuxDriver
#driver=gnu.io.RXTXCommDriver

Paths to server-side serial port devices

serpath0 = /dev/ttyS0
serpath1 = /dev/ttyS1
serpath2 = /dev/ttyS2
serpath3 = /dev/ttyS3

Paths to server-side parallel port devices

parpath0 = /dev/ecpp0
parpath1 = /dev/printers

As portas seriais do computador listadas pelo comando ls-all …

crw-rw---- 1 root dialout 4, 64 2010-01-04 08:41 /dev/ttyS0
crw-rw---- 1 root dialout 4, 65 2010-01-04 08:41 /dev/ttyS1
crw-rw---- 1 root dialout 4, 66 2010-01-04 08:41 /dev/ttyS2
crw-rw---- 1 root dialout 4, 67 2010-01-04 08:41 /dev/ttyS3

A saída do comando whoami
t3rcio

E, admito que tentando resolver o problema e recorrendo a outros fóruns, já modifiquei essas configurações quanto à localização de bibliotecas *.jar e *.so. Porém sempre as mantive nos diretórios especificados acima. Ah! E lembrando que já tentei a execução do programa como superusuário também :wink:

Brigado Galera!

M

Com o usuário atual você não vai conseguir executar mesmo, devido às permissões. Mas se executou como root e não deu certo, não deve ter a ver com isso. Como root o erro é o mesmo?

Todo caso, tente usar a seguinte linha de comando e depois executar novamente (como usuário comum, mesmo):
sudo chmod a+rw /dev/ttyS[0-4]

T3rcio

No início eu pensei que fosse uma questão de permissões também.
Mas como root o erro é o mesmo do que quando executo como usuário normal ( t3rcio ).

Tentei a sua sugestão marcobiscaro2112, mas não deu certo =\\.
O interessante é que o programa consegue listar as portas normalmente. A exceção ocorre apenas no método open.

Um pedaço do código abaixo:

Enumeration ListPorts = CommPortIdentifier.getPortIdentifiers();
    
    public void lerSerial() throws FileNotFoundException, IOException, PortInUseException, NoSuchPortException, UnsupportedCommOperationException {
                
        while (ListPorts.hasMoreElements()) {
            CommPortIdentifier PortID = (CommPortIdentifier) ListPorts.nextElement();
            if (PortID.getPortType() == CommPortIdentifier.PORT_SERIAL) {
                SerialPort TTY = null;
                try {
                    TTY = (SerialPort)PortID.open("Serial", 4000);
                } catch (PortInUseException ex) {
                    //Logger.getLogger(readSerial.class.getName()).log(Level.SEVERE, null, ex);
                    System.out.print("Ocorreu uma excessão ao abrir a porta:\n" + ex.getMessage() + "\n");
                    System.out.print("Tentando abrir outra porta");
                    continue;
                }
Eu tentei usar a sobrecarga do método open, para um descritor de arquivos. O Linux encara tudo como arquivo, então imaginei que seria a opção mais razoável. Entretanto, ao usar essa sobrecarga do open, a exceção UnsupportedCommOperation é lançada. Eu gosto de desafios, mas esse já tá me tirando do sério. Alguém tem uma bazuca por aí?! :-D
M

A minha está no concerto. :slight_smile:

Mas se o programa lista, realmente não é problema de permissão. O mais estranho é que a exceção não vem acompanhada de nenhuma mensagem (geralmente ela vem com um “Permission denied” ou “Port in use”).

T3rcio

Droga! nem bazuca?! hehehe

Exatamente marcobiscaro2112! A exceção não informa o danado do erro =\
Fui atrás desse “tcgetattr(): Input/output error” - e pelo que entendi o que ele faz é apenas informar erros de I/O no sistema.

O máximo que faz é indicar a linha do erro no driver da Sun, escrito para Linux. Se a gente tivesse o código do drive, quem sabe ficaria mais fácil de resolver isso.
Quanto a RXTX ela não usa o mesmo “comm.jar” da Sun?
Admito que tentei usá-la, mas não deu certo. =\ Se bem que eu acredito que preciso rever os passos da configuração. Não descarto a possibilidade de ter colocado algum arquivo em um diretório errado, de tão tonto que estou com essa API =p

M

Pois é. Ter o código fonte ajudaria mas olha só o que consta no FAQ do JavaComm:

T3rcio

Resumindo:

Esqueça os fontes. =\

Bom, o jeito, pelo que tudo indica, é partir ou para a RXTX, ou usar uma linguagem que me permita o acesso às portas em um nível mais baixo, tipo C ou C++. É o jeito jogar um óleo nas articulações enferrujadas do C++.
E, continuando no serial, mas em um protocolo diferente e mais rápido,além de versátil: Java + USB - alguém já trabalhou?

Criado 5 de janeiro de 2010
Ultima resposta 5 de jan. de 2010
Respostas 9
Participantes 3