Portas Paralelas,Seriais e Usb em Java?

13 respostas
ribeiro220

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

13 Respostas

yorgan

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

ribeiro220

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

yorgan

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

ribeiro220

É ,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

yorgan

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.

ribeiro220

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…

gqferreira
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.
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;
	}
}
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 ;)

ribeiro220

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

iogui

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:

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

J

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


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/

iogui

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

Já ouviu falar da palavra chave “Native” ?

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

ribeiro220

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

Criado 28 de janeiro de 2011
Ultima resposta 30 de jan. de 2011
Respostas 13
Participantes 5