Jogo Batalha Naval através de Interface serial

11 respostas
lisiane_rm

Boa tarde pessoal,

Nao tenho experiencia em programação e estou com uma grande duvida, gostaria da ajuda de voces…
Meu professor de Teleprocessamento nos passou um trabalho prático, que consiste em fazer o clássico jogo Batalha Naval
utilizando a comunicação serial do PC para o envio das coordenadas pelos jogadores.

Encontrei um codigo fonte na internet para o funcionamento da interface serial, mesmo apos estuda-lo nao estou conseguindo entender como eu irei enviar ou receber uma coordenada atraves da serial.

No jogo estou usando duas matrizes de JButton, uma matriz é a do jogador e a segunda matriz do adversário. Quando apertar um botao da matriz do adversario precisa enviar essa
informaçao via serial para outro PC, a mesma coisa é o contrario, quando receber um “tiro” do adversario, deve fazer a leitura e atingir a “agua ou o navio” da minha matriz de jogador.
Em anexo esta meu codigo fonte, se alguem puder me auxiliar, ficarei muito grata.

11 Respostas

A

Olá lisiane,

Não entendi muito bem o qual seu problema de entendimento, vou dar uma resumida.
O código fonte abaixo serve para abrir a comunicação serial onde vc indica porta de comunicação,
Exemplo windows: COM1
Exemplo linux: /dev/ttyS0
essas portas são alocadas dinamicamente pelo S.O, como é uma comunicação serial vc tem que indicar qual velocidade (9600),
se comunicação utiliza bit de paridade “PARITY_NONE”, dado a ser enviado vai ser trafegado em qtos bits “DATABITS_8” …

try {
				JOptionPane.showMessageDialog(null, "Comunicação Serial\n"
						+ "Porta Serial: " + portName
						+ "\nBits por segundo: 9600" + "\nBits de Dados: "
						+ SerialPort.DATABITS_8 + "\nParidade: "
						+ SerialPort.PARITY_NONE + "\nBits de Parada: "
						+ SerialPort.STOPBITS_1);
				// Abre a porta serial solicitada//2000=timeout
				SerialPort serialPort = (SerialPort) portId.open(this
						.getClass().getName(), 2000);

				// Pega o InputStream da Porta Serial
				inputStream = serialPort.getInputStream();
				outputStream = serialPort.getOutputStream();
				(new Thread(new SerialReader(inputStream))).start();
				(new Thread(new SerialWriter(outputStream))).start();
				// Cria um novo Listener de Eventos
				serialPort.addEventListener(this);

				// Avisa se tive alguma mudança na Porta Serial
				serialPort.notifyOnDataAvailable(true);

				// Passa os parametros da porta serial
				serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,
						SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

			} catch (PortInUseException e) {
			}
bom, agora quem escreve e  na serial:

Veja que foi criado 2 threads (Processo concorrentes),

1 - Fica monitorando o que está entrando InputStream, se houver alguma coisa para receber ele joga na console.

System.out.print(new String(buffer, 0, len));

2 - Fica esperando vc digitar algo na console para enviar pela serial.

System.in.read()
public static class SerialReader implements Runnable {
		InputStream in;

		public SerialReader(InputStream in) {
			this.in = in;
		}

		public void run() {
			byte[] buffer = new byte[1024];
			int len = -1;
			try {
				while ((len = this.in.read(buffer)) > -1) {
					System.out.print(new String(buffer, 0, len));
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public static class SerialWriter implements Runnable {
		OutputStream out;

		public SerialWriter(OutputStream out) {
			this.out = out;
		}

		public void run() {
			try {
				int c = 0;
				while ((c = System.in.read()) > -1) {
					this.out.write(c);
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

espero ter ajudado …

G

Boa tarde lisiane_rm , gostaria de saber se vc poderia me passar o esquema do hardware, pois quando fiz faculdade só estudamos a paralela! e gostaria de sber se vc tbm teria o esquema da USB!

Obrigado!!! =]

lisiane_rm

Valeu pela explicação Andre,

Bem ainda tenho a seguinte duvida, imagine a seguinte situação, quando forem realizada as jogadas, será dado um clique em um botao na posição x,y do tabuleiro do adversario. Essa posição da matriz é preciso ser enviada atraves da porta serial, certo? Isso que nao to conseguindo entender… Como posso enviar via serial essa informação?
Talvez seja uma dúvida tola, mas não consigo dar continuidade no jogo…

Agradeço se voce conseguires me dar um exemplo, ou algumas dicas :slight_smile:

abs,
Lisiane Morais

lisiane_rm

Boa noite Gui_Simoes,

Em anexo um arquivo em pdf com informações da porta serial, espero ajuda-lo.
Mas infelizmente nao tenho o esquema da USB.

Abs,

Lisiane Morais

lisiane_rm

Gui_Simoes,

Encontrei um site interessante, acredito que possa lhe auxiliar, explica sobre o hardware da USB.

http://www.beyondlogic.org/usbnutshell/usb2.shtml

abs.

G

Poxa legal!! não conhecia esse site!!
eu também pensei em partir pro arduíno…não sei se vc conhece

matheuslmota

Você pode especificar algum objeto para comunicação e trabalhar com o envio desse objeto serializado pela serial. Suponha que você tenha uma classe Jogada. Essa classe teria um atritbuto coordenadas na qual você teria as coordenadas do tabuleiro. Você então serializaria esse objeto e enviaria pela serial. O outro pc iria desserializar o objeto e ter uma instância da classe jogada.

Procure por tutoriais sobre a serialização em Java.

Uma outra dica é que você não precisa trabalhar diretamente com a porta serial, que é bastante difícil de achar nos computadores atuais. Você pode usar um cabo usb normal e usar o driver PL2303 para fazer a emulação de uma porta serial a partir de uma porta USB do PC.

A

Olá a todos, bom vamos lá

Começando com o problema lisiane,

Seguinte se vc tem como pega as coordenadas já é meio caminho andado não coloquei o projeto pra rodar pois estou sem tempo … :frowning:
Mas a dica e o seguinte vc tem uma classe de interface (Usuário), e outra comunicação (serial) com outro computador, isso ??

BoardGUI

//instancia um objeto da seralComm
 SerialComm portSerial = new SerialComm(this);

SerialComm

private BoardGUI boardGUI;
        
    public SerialComm(BoardGUI boardGUI) {
        this.boardGUI = boardGUI;
    }

public static class SerialReader implements Runnable {
		InputStream in;

		public SerialReader(InputStream in) {
			this.in = in;
		}

                @Override
		public void run() {
			byte[] buffer = new byte[1024];
			int len = -1;
			try {
				while ((len = this.in.read(buffer)) > -1) {
//					System.out.print(new String(buffer, 0, len));
//                                     Veio alguma coisa manda para a Interface fazer os calculos coordenadas
//                                        boardGUI.ModificaInteface(new String(buffer, 0, len))
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public static class SerialWriter implements Runnable {
		private OutputStream out;
                private String escrita="";
                
		public SerialWriter(OutputStream out) {
                    this.out = out;
		}
                
                public void setEscrita(String escrita) {
                    this.escrita = escrita;
                }   

                @Override
		public void run() {
			try {
				int c = 0;
                                while (this.escrita.length()>0){
                                    this.out.write(this.escrita.getBytes());
                                }
//				while ((c = System.in.read()) > -1) {
//					this.out.write(c);
//				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}       
        }

Transitar objetos serializados numa comunicação serial eu considero uma má ideia … ela não tem protocolo de controle formado que nem o TCP pode dar problema e vc não sabe aonde está.

gui_simoes_guj,

Se for trabalhar com virtualização de USB para utilização serial, não utilize a biblioteca desse exemplo, desde 2008 a comunicação serial tem sido mal vista como investimento de esforços tanto pela SUN na época, quanto pela ORACLE atualmente.
Mas tem bastante esforços para uma biblioteca terceira para comunicação serial chamado JSSC (java-simple-serial-connector).
de uma olhada nos exemplos: http://code.google.com/p/java-simple-serial-connector/wiki/jSSC_examples#Reading_data_from_serial_port
Suporte há Win32, Win64, Linux_x86, Linux_x86_64, Solaris_x86, Solaris_x86_64, MacOSX_x86, MacOSX_x86_64, MacOSX_PPC, MacOSX_PPC64.
Testei apenas em windows 32 e 64, funciona.

G

Cara…desculpa a demora… agradeço demais seu post… mas o problema maior é o hardware =//

A

Olá gui_simoes_guj,

Sobre hardware realmente não posso te ajudar por falta de conhecimento, trabalho com interação de equipamentos com software … Vou te falar de experiências do pessoal que trabalho me passou, fizeram alguns testes de integração para agilizar no desenvolvimento de um protótipo de produto, onde utilizamos o arduino para facilitar na implementação de protocolo USB HID, quebrou um galho para entregar o projeto no prazo, mas para produto final falta bastante amadurecimento do projeto em si … Outra experiência do arduino obtive com colega de faculdade onde implementava um o protocolo SNMP, apartir de um kit arduino com rede TCP/IP, também falou que obteve péssimas experiências que teve que implementar bastante coisa, por falta de bibliotecas de implementações, restrições e transição de atualizações do próprio arduino.

G

Ah sim, entendi! de qualquer forma obrgado!
Assim que eu fizer meus testes vou postando aqui!

Criado 30 de novembro de 2012
Ultima resposta 6 de dez. de 2012
Respostas 11
Participantes 4