Comunicação Serial

28 respostas
M

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:

28 Respostas

O

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

M

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 ?

H

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

M

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:

H
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
InputStream  datain;
    OutputStream dataout;
    
    SerialPort	 porta;
    public static final String nomePorta="/dev/ttyS0";
    
    
    boolean encontrada=false;
"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

W

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 ?

W

porque ele tenta carregar esse SolarisSerial ?

H

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

H

Ah! Tem o javax.comm.properties no

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

ou o javax.comm.properties no classpath

W

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

M

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…

W

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

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

H

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”

W

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

H

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:

W

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

H

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.

W

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

H

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

W

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

quero ler da /dev/ttyS0

H

Para configurar no minicom “configurations”

┌───────────────────────────────────────────────────────────────────────┐
│ A - Dispositivo Serial            : /dev/ttyS1                        │
│ B - Localizabpo do Arquivo de Travamento : /var/lock                  │
│ C - Programa de Entrada           :                                   │
│ D - Programa de SaØda             :                                   │
│ E - Bps/Paridade/Bits             : 38400 8N1                         │
│ F - Controle de Fluxo por Hardware: Sim                               │
│ G - Controle de Fluxo por Software: Npo                               │
│                                                                       │
│    Alterar qual configurabpo?                                         │
└───────────────────────────────────────────────────────────────────────┘

Seta o serial device
depois use “o comm properties” tem o menu

┌──────[ParTmetros de Comunicabpo]───────┐
                    │                                        │
                    │ Current: 38400 8N1                     │
                    │                                        │
                    │   Velocidade     Paridade        Dados │
                    │                                        │
                    │ A: 300           L: Nenhuma      S: 5  │
                    │ B: 1200          M: Par          T: 6  │
                    │ C: 2400          N: =mpar        U: 7  │
                    │ D: 4800          O: Marca        V: 8  │
                    │ E: 9600          P: Espabo             │
                    │ F: 19200                      Stopbits │
                    │ G: 38400                         W: 1  │
                    │ H: 57600                         X: 2  │
                    │ I: 115200        Q: 8-N-1              │
                    │ J: 230400        R: 7-E-1              │
                    │                                        │
                    │                                        │
                    &#9474; Escolha a opbpo, ou <Enter> para sair: &#9474;
                    &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;

configure de acordo com o fabricante do hardware.
Pronto vc já pode ler a porta.

Obs.: geralmente para um device gerar output tem-se que enviar alguns bytes de controle como “quanto de memoria vc tem? 0x10,0xEF, etc”

W

valew todas as ajudas amigo, mas eu acho que meu principal problema é que eu nao consigo carregar o modulo serial_cs

da isso aqui

root@william:/etc/rc.d# modprobe serial_cs
/lib/modules/2.4.31/kernel/drivers/pcmcia/ds.o.gz: init_module: Operation not permitted
/lib/modules/2.4.31/kernel/drivers/pcmcia/ds.o.gz: Hint: insmod errors can be caused by incorrect module parameters, including invalid IO or IRQ parameters.
      You may find more information in syslog or the output from dmesg
/lib/modules/2.4.31/kernel/drivers/pcmcia/ds.o.gz: insmod /lib/modules/2.4.31/kernel/drivers/pcmcia/ds.o.gz failed
/lib/modules/2.4.31/kernel/drivers/pcmcia/ds.o.gz: insmod serial_cs failed

sabe me dizer o que possa ser isso ?

H

Taca aqui o retorno do comando

[root@nash voip]# dmesg | egrep "(serial|tty|irq)"
W

hashcode:
Taca aqui o retorno do comando

[root@nash voip]# dmesg | egrep "(serial|tty|irq)"

ta aqui

ttyS00 at 0x03f8 (irq = 4) is a 16550A ttyS01 at 0x02f8 (irq = 3) is a 16550A VP_IDE: not 100% native mode: will probe irqs later ide0 at 0x1f0-0x1f7,0x3f6 on irq 14 ide1 at 0x170-0x177,0x376 on irq 15 ehci_hcd 00:10.3: irq 5, pci mem ceabb000 parport0: irq 7 detected

H
ttyS00 at 0x03f8 (irq = 4) is a 16550A
ttyS01 at 0x02f8 (irq = 3) is a 16550A

Observe uma coisa. Veja que vc tem as portas seriais detectadas como /dev/ttyS00 e não /dev/ttyS0 /dev/ttyS01 e não /dev/ttyS1 .
Pode fazer um teste se tiver um device do tipo mouse na primeira porta seria /dev/ttyS0 (que no seu caso acho que é /dev/ttyS00) e dê um

cat /dev/ttyS00

Mexa com o mouse, click(finja que tá jogando :D) no bash vai aparecer bytes muito doídos.

Verifique isso ai e retorne.

W

ehheheaheahea

pensei nisso, mas nao é tambem :frowning:

root@william:~# cat /dev/ttyS00 cat: /dev/ttyS00: No such file or directory

com o cat /dev/ttyS0

ele me retorna um monte de caracteres quando mecho o mouse…

P

Oi Pessoal…

Desculpa a minha ignorancia, mas sou novo em JAVA e onde estou trabalhando me deram a missão de comunicar uma balança rodoviária com a porta serial do PC… Li muito sobre o que vc´s escreveram aqui e já me ajudou a ter pelo menos uma ideia de onde começar!!! Compilei a classe SimpleRead.java do pacote e está td ok… Agora estou tentando fazê-la comunicar com um formulário comum em HTML de uma pagina JSP… Alguém por acaso sabe como por onde posso começar??? Já tentei de tudo aqui…

Aguardo algum contato pelo forum ou msm pelo email [email removido].

Desde já agradeço a ajuda de todos!!!

B

Tou me iniciando nesta andanças de Jcomm e Java porque preciso fazer comunicação serial com uma placa ALFATXP para leitura de temperaturas. Alguem me pode dar uma ajuda para eu me iniciar??Tipo quais os passos que tenho que fazer para instalar bibliotecas necessarias para Windows XP e um pequeno codigo para eu testar??Tipo devolver quais as portas que o Computador tem ou assim??

Abraço e Muito Obrigado

Criado 11 de julho de 2006
Ultima resposta 13 de jun. de 2008
Respostas 28
Participantes 6