Comunicação Serial

Fala aeh Pessoal :smiley:

Espero que voces possam me ajudar nessa, estou desenvolvendo um .class que irá enviar os dados necessários para gerar um template e um código de barras para uma InterMec 3400, e por isso precisar saber como fazer conexão serial via Java, estou lendo alguns artigos e usando o bom e jovem “Google”, sei como funciona uma conexão, estava usando o HyperTerminal, mas agora com Java eu travei…

Voce poderiam me indicar algum artigo ou mesmo de dizer como faço esse tipo de conexão, como definio o Bit de Parada, a velocidade, o numero de Bits… a conexão XON/XOFF…

Muito Obrigado Pessoal, Abraços… :slight_smile:

http://java.sun.com/products/javacomm/

Valeu pelo Link,

Mas eu já tinha conseguido achar ele, puxei o Generic do Java™ Communication API, e joguei o comm.jar dentro da pasta C:\Arquivos de programas\Java\j2re1.4.2_12\lib, mas oque me falta não é biblioteca… eu precisaria de alguma código que me desse uma ajuda, por mais simplório que seja apenas para poder me referenciar quando começar… me pouparia mto tempo :wink:

Alguem já mexeu com isso ?

Eu já fiz um projeto para PinPad da Gertec ppc800 serial para linux? O seu é Linux?

Na verdade não. eu estou usando Win XP…

Estou achando códigos bem complexos para conexão com porta serial, mas eu preciso apenas mandar um string , simplismente isso, algo com que eu pudesse estabelecer um tipo de conexão simples… mas está se mostrando desafiador :wink:

Toda ajuda que voces puderem me dar ajuda. valeu pessoal :smiley:

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

to na luta :x

usei o arquivo de exemplo SimpleRead, mas dá esse erro

run:
Error loading SolarisSerial: java.lang.UnsatisfiedLinkError: no SolarisSerialParallel in java.library.path
Caught java.lang.UnsatisfiedLinkError: readRegistrySerial while loading driver com.sun.comm.SolarisDriver
Error loading SolarisSerial: java.lang.UnsatisfiedLinkError: no SolarisSerialParallel in java.library.path
Caught java.lang.UnsatisfiedLinkError: readRegistrySerial while loading driver com.sun.comm.SolarisDriver
port /dev/ttyS0 not found.

alguma ideia ?

porque ele tenta carregar esse SolarisSerial ?

SolarisSerial é o mesmo libLinuxSerialParalell.so, mas portado para linux. Já tacou os .so no /usr/lib?
Execute com -Djava.library.path=/usr/lib

Ah! Tem o javax.comm.properties no

$JAVA_HOME/jre/lib/javax.comm.properties

ou o javax.comm.properties no classpath

cara, nao consegui fazer o que voce falou !!
como faço
:?: :?: :?:

Opa, isso que eh gente fina :smiley:

Brigadão, voce me ajudou mto, agora só preciso adapatar o código que eu consegui fazer com a ajuda do seu, só tinha 1 errinho de variavel que não podia ser enxergada, mas de resto tava perfeito…

obrigado mesmo…

[quote=hashcode]SolarisSerial é o mesmo libLinuxSerialParalell.so, mas portado para linux. Já tacou os .so no /usr/lib?
Execute com -Djava.library.path=/usr/lib[/quote]

ja copieo os .so … mas nao entendi o que voce quis dizer com o codigo acima :!:

Parâmetro de execução


java -Djava.library.path=/usr/lib -jar suaaplicacao.jar

ou se estiver usando alguma IDE taca isso em algo como “VM arguments”

amigo, me ajude a descobrir o que esta acontecedo

String                    defaultPort = "/dev/ttyS0";
 	if (args.length > 0) {
	    defaultPort = args[0];
	} 
   
	portList = CommPortIdentifier.getPortIdentifiers();
        
	while (portList.hasMoreElements()) {
            System.out.println("entro aqui");
	    portId = (CommPortIdentifier) portList.nextElement();
	    if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
                System.out.println("Nome da merda da porta:"+portId.getName());
		if (portId.getName().equals(defaultPort)) {
		    System.out.println("Found port: "+defaultPort);
		    portFound = true;
		    Leitura reader = new Leitura();
		} 
	    } 
	} 
	if (!portFound) {
	    System.out.println("port " + defaultPort + " not found.");
	} 

com esse meu codigo ele ta caindo ali na linha como se a variavel portFound não estivesse setada.

tá retornando isso aqui, não dá erro nenhum

port /dev/ttyS0 not found. BUILD SUCCESSFUL (total time: 4 seconds)

estou usando a IDE Netbeans, não sei tem alguma diferença

valew

A API javax.comm usa um arquivo javax.comm.properties, lá tem um mapeamento das portas disponíveis no seu sistema.

# Implementation specific driver
driver=com.sun.comm.LinuxDriver

# Paths to server-side serial port devices
serpath0 = /dev/ttyS0
serpath1 = /dev/ttyS1

# Paths to server-side parallel port devices
parpath0 = /dev/lp0
#parpath1 = /dev/parport1
  1. Passo: verifique se está descomentado as linhas no arquivo acima referenciado.
  2. Passo: taca o arquivo em
 $JAVA_HOME/jre/lib/javax.comm.properties
  1. Passo: carrege o módulo serial_cs com
insmod serial_cs

ou

modproble serial_cs

Duas dicas:
Primeira -> Teste com minicom as portas seriais, lá tem os parametros de velocidade, paridade, etc.
Segunda - > Na linha

System.out.println("Nome da merda da porta:"+portId.getName());

vc está tratando mal a porta cara! Ela tá te sacaneando !! Trate bem ela!!
fala para ela assim “se vc funcionar te promovo a USB”(piada de programador!).
Brincadeira! hahah!! :smiley:

uhuu :smiley:

valew a ajuda cara, consegui porém sem carregar o modulo serial_cs, parece que meu kernel nao tem suporte PCMCIA, aliás, porque precisa desse modulo ?

to quase conseguindo 8)

mas to com um problema, eu to fazendo no netbeans, quando executo por ele blz, funciona… mas se eu for direto na aplicacao roda, ele da erro como se tivesse faltando os arquivos da api COMM :S

Tive que carregar serial_cs para que os parêmetros de velocidade, etc funcionarem. Se deu beleza.
Não entendi seu erro COMM taca o stacktrace aqui.

sem quere abusar , mas ja abusando…

eu to fazendo o programinha para ler a serial… com o minicom eu consigo testar isso tambem ?

tentei e nao consegui aqui

Primeiramente vc quer ler ou escrever no device? Qual device?