Portas Paralelas,Seriais e Usb em Java?

Boa tarde aos colegas do forum!
Há exatamente 1 mes e 3 dias que estou aprendendo a lidar com essa maravilhosa linguagem de programação Java.
Agora na sequencia de meus estudos,gostaria de acessar as portas do pc(serial,paralela ou usb).
Andei pesquisando e verifiquei que a SUN(oracle)não tem muito interesse em se preocupar com essa interação entre software e hardware,estou correto no meu comentario ou é impressão?
Se alguém tiver alguma informação sobre algum material novo, pois tenho pesquisado e tem muitas informações antigas.
grato

Então, dependendo o que você quiser fazer, é mais fácil utilizar uma ponte com DLL’s do que fazer diretamente com java.
Mas para USB existe esse projeto http://jusb.sourceforge.net/

[]'s
Daniel

yorgan ,boa tarde
A principio ,acender um led na porta paralela(treinamento para aprimorar conhecimento)e partir para a serial lendo e escrevendo nas portas(automação e controle de cargas)
Tipo voce poder fazer mediçoes(leituras de sensores) e ao mesmo tempo ligar ou desligar alguma carga,um motor por exemplo.
O que voce quer dizer com fazer uma ponte com DLL,poderia me explicar?
valeu

Então.
Quando eu programava em VB, era tranquilo enviar um sinal para porta paralela e ficar brincando com leds.
Mas em java eu vi que a coisa não era tão simples.
Para trabalhar com essas coisas é mais comum fazer uma DLL que faça a comunicação com as portas e fazer o java comunicar com essa DLL.
Mas se for para trabalhar com eletrônica, eu acho melhor utilizar Arduino.
Desde que conheci essa solução, desisti de tentar fazer o Java conectar diretamente com essas portas.

[]'s
Daniel

É ,realmente voce tem razão,a dificuldade em comunicar com portas em java pelo jeito é geral…
mas,uma linguagem que faz um monte de coisas ,coloca voce mais proximo do real é estranho que tenha abandonado a ideia de comunicação com o mundo externo(hardware)
vamos ver se a Oracle pense diferente,enquanto isso vou tentando com o que tem de disponivel na internet.
acho que vou até mandar um email pra eles questionando sobre o assunto…

grato

Não sei, acho que esse tipo de comunicação é melhor deixar para linguagens nativas do sistema operacional.
O foco do java, ao meu ver, é outro.
Já o Arduino resolve esse problema. Tudo é escrito em C, mas tem todas as ferramentas para comunicação com Java, tanto que sua IDE foi feita em Java.

Já me falaram do arduino e até andei atras,o microcontrolador parece que é da Atmel,trabalho com os da microchip(PIC)tem um pessoal trabalhando na edição de um livro programação java pra pic.
não sei como eles colocaram algo parecido com a JVM lá dentro …

um abraço e obrigado por suas dicas…

Para mexer com portas seriais, procure por rxtxcomm.
Para comunicar com portas paralelas é mais simples.
Sabe aquelas impressoras de cupom não fiscal? (aquelas que fazem tátá tátátá o dia inteiro na orelha de um programador) Elas são conectadas atravez da porta paralela LPT. Se você criar uma porta LPT1 no Sisitema Operacional e conectar a impressora nessa porta, basta usar:

PrintWriter pw = new PrintWriter("LPT1");
pw.print("OI?")
pw.close();

Vai sair “OI?” na sua impressora.

Agora basta intender o que o seu hardware precisa receber e passar.
Precisei trabalhar com um impressora de etiqueta com porta paralela, li a documentacao e a sintaxe dela, entao passei o que ela precisava.

Também ja precisei trabalhar com impressoras com memória fiscal na porta serial, sem dll do fabricante, mandando os dados direto para a porta (com auxilio de uma dll para conexao com a porta). Usei essa forma, estabeleco a conexao com a porta e “meto bala (bytes)”

Uma classe utilitária para porta serial.

[code]

import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.TooManyListenersException;

public class ComunicacaoSerial implements SerialPortEventListener {
public static int DATABITS_5 = SerialPort.DATABITS_5;

public static int DATABITS_6 = SerialPort.DATABITS_6;

public static int DATABITS_7 = SerialPort.DATABITS_7;

public static int DATABITS_8 = SerialPort.DATABITS_8;

public static int STOPBITS_1 = SerialPort.STOPBITS_1;

public static int STOPBITS_1_5 = SerialPort.STOPBITS_1_5;

public static int STOPBITS_2 = SerialPort.STOPBITS_2;

public static int PARIDADE_PAR = SerialPort.PARITY_EVEN;

public static int PARIDADE_NENHUMA = SerialPort.PARITY_NONE;

public static int PARIDADE_ESPACO = SerialPort.PARITY_SPACE;

public static int PARIDADE_IMPAR = SerialPort.PARITY_ODD;

public static int PARIDADE_SINAL = SerialPort.PARITY_MARK;

private SerialPort serialPort = null;

private InputStream entrada = null;

private OutputStream saida = null;

private static ComunicacaoSerial comunicacaoSerial = null;

private boolean existeDados = false;

private byte[] dados = null;

private ComunicacaoSerial() {

}

public static ComunicacaoSerial getReference() {
	if (null == comunicacaoSerial) {
		comunicacaoSerial = new ComunicacaoSerial();
	}

	return comunicacaoSerial;
}

public void conexao(String nomePorta, int velocidade, int dataBits,
		int stopBits, int paridade) {
	try {
		CommPortIdentifier portIdentifier = CommPortIdentifier
				.getPortIdentifier(nomePorta);
		if (portIdentifier.isCurrentlyOwned()) {
			System.out.println("Erro: Porta " + nomePorta
					+ " já está em uso.");
		} else {
			CommPort commPort = portIdentifier.open("ComunicacaoSerial",
					2000);
			if (commPort instanceof SerialPort) {
				serialPort = (SerialPort) commPort;
				serialPort.setSerialPortParams(velocidade, dataBits,
						stopBits, paridade);
				serialPort.setRTS(true);
				serialPort.setDTR(true);
				serialPort.addEventListener(this);
				serialPort.notifyOnDataAvailable(true);
				entrada = serialPort.getInputStream();
				saida = serialPort.getOutputStream();
			} else {
				System.out.println("Erro: " + nomePorta
						+ " não é uma porta serial");
			}
		}
	} catch (NoSuchPortException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (PortInUseException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (UnsupportedCommOperationException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (TooManyListenersException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

public byte[] leituraPortaSerial() {
	byte[] buffer = null;
	ByteArrayOutputStream dadosLidos = new ByteArrayOutputStream();

	try {

		while (entrada.available() > 0) 
		{
			dadosLidos.write(entrada.read());
		}
		buffer = dadosLidos.toByteArray();
		dadosLidos.close();

	} catch (IOException e) {
		e.printStackTrace();
	}

	return buffer;
}

public byte leituraStatusPortaSerial() {
	byte buffer = 0;

	try {
		buffer = (byte) entrada.read();
	} catch (IOException e) {
		e.printStackTrace();
	}

	return buffer;
}

public void escritaPortaSerial(byte[] dadosEscrita) {
	try {
		saida.write(dadosEscrita); 
	} catch (IOException e) {
		e.printStackTrace();
	}
}

@SuppressWarnings("unchecked")
public void listaPortas() {
	Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();
	System.out.println("PORTAS ENCONTRADAS:");
	while (portEnum.hasMoreElements()) {
		CommPortIdentifier portIdentifier = (CommPortIdentifier) portEnum
				.nextElement();
		System.out.println(portIdentifier.getName() + " - "
				+ getTipoPorta(portIdentifier.getPortType()));
	}
}
@SuppressWarnings("unchecked")
public List<String> getPortas() {
	Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();
	List<String> portas = new ArrayList<String>();
	while (portEnum.hasMoreElements()) {
		CommPortIdentifier portIdentifier = (CommPortIdentifier) portEnum.nextElement();
		portas.add(portIdentifier.getName());			
	}
	return portas;
}
private String getTipoPorta(int tipoPorta) {
	switch (tipoPorta) {
	case CommPortIdentifier.PORT_I2C:
		return "I2C";
	case CommPortIdentifier.PORT_PARALLEL:
		return "Parallel";
	case CommPortIdentifier.PORT_RAW:
		return "Raw";
	case CommPortIdentifier.PORT_RS485:
		return "RS485";
	case CommPortIdentifier.PORT_SERIAL:
		return "Serial";
	default:
		return "unknown type";
	}
}

public void fechaConexao() {
	try {
		entrada.close();
		saida.close();
		serialPort.removeEventListener();
		serialPort.close();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

public void serialEvent(SerialPortEvent event) {

	switch (event.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:
		break;
	case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
		break;
	case SerialPortEvent.DATA_AVAILABLE:
		dados = leituraPortaSerial();
		existeDados = true;
		break;
	}
}

public byte[] getDados() {
	//existeDados = false;
	return dados;
}

public boolean existeDadosDisponiveis() {
	return existeDados;
}

}[/code]

Exemplo de como usufruir dessa classe:

String printerCodes = char(13); //char de 13 é o enter, ou em binario, 00001101 ComunicacaoSerial comunica = ComunicacaoSerial.getReference (); comunica.conexao ("COM1",1234,2, 1,0); //esses dados eu inventei, vai depender da configuracao da sua porta no Sistema Operacional. comunica.escritaPortaSerial (printerCodes.getBytes ());
Obs.: Eu nao testei o codigo acima, mas se tiver algo errado é detalhe, além do mais, voce pode olhar como funciona a classe utilitaria que passei.
Não esqueça de baixar a api para conexao com portas seriais, RXTXCOMM

Boa sorte :wink:

Muito obrigado yorgan e gqferreira pelo interesse em ajudar… :idea:
Vou pesquisar mais sobre o assunto…
abraço

ribeiro220,

Se você realmente quer mexer a nível tão baixo lidando diretamente com o hardware e fazer coisas pra automação, sugiro que vc faça isto em C++ que vai lhe permitir ficar mais próximo do hardware. E aí, se quiser desenvolver aplicação Java que faça acesso a estas coisas, faça a parte de acesso em código nativo/C++ e apenas use isto no Java.

Fazendo desta forma, vc vai ter muito menos limitação e acho que vai conseguir fazer tudo o que quiser.
Entretanto… vai ter um tremendo trabalhão… rs

Taí uma coisa que eu até gostaria de fazer mas não me aventuro por falta de tempo.

Sabe como é né? A vida são escolhas… rs :wink:

Já fiz algumas coisas em C,sou iniciante em Java só não entendo esse negocio de código nativo e como fazer essa ligação de uma linguagem com outra…tipo acessar as portas em uma linguagem e integrar a mesma com um painel(desktop) feito em java
Obrigado pelas dicas

[quote=ribeiro220]

Já fiz algumas coisas em C,sou iniciante em Java só não entendo esse negocio de código nativo e como fazer essa ligação de uma linguagem com outra…tipo acessar as portas em uma linguagem e integrar a mesma com um painel(desktop) feito em java
Obrigado pelas dicas[/quote]
Um bom exemplo disso é que você irá escrever possívelmente suas dlls para comunicação com o hardware em C ou C++ e irá utilizar essas dlls no seu programa em java. Você pode fazer uso de dlls escritas em C e C++ no java por JNI ou JNA

JNI : http://java.sun.com/docs/books/jni/
JNA : https://jna.dev.java.net/

[quote=ribeiro220]

Já fiz algumas coisas em C,sou iniciante em Java só não entendo esse negocio de código nativo e como fazer essa ligação de uma linguagem com outra…tipo acessar as portas em uma linguagem e integrar a mesma com um painel(desktop) feito em java
Obrigado pelas dicas[/quote]

Já ouviu falar da palavra chave “Native” ?

http://homepages.dcc.ufmg.br/~bigonha/Cursos/Ap/Native/JavaNativeMethod.html

Caros companheiros,não sei como agradece-los,
informações como essas se fosse cobrar,seria uma fortuna!!!
É por isso que este forum só cresce,só tem profissionais :stuck_out_tongue:
Vou dar uma boa estudada e quando tiver avanço,comunicarei à todos…
DEUS ABENÇOE
Tenham um bom domingo