Java x Arduino

Tudo bem, pessoas?

Estou fazendo um protótipo para meu projeto de TCC e me deparei com um certo problema.
Preciso basicamente, em java, receber uma String lida de uma TAG num sensor RDM6300…
Até aí tudo bem. consegui fazer um código no Ard pra fazer a leitura e “printar” a imagem corretamente, qual segue:

#include <SoftwareSerial.h>

SoftwareSerial RFID(19,1);
const int buzzer = 10;

void setup(){
  RFID.begin(9600);
  pinMode(buzzer,OUTPUT);  
}
char val[13];
String m, tag;
byte c;

void loop(){
  if (RFID.available() > 0 ){
    
    RFID.readBytes(val,13);
    if (val > 0){
    tone(buzzer,2500);   
    delay(250);
    }
    
    m = val;
    tag = m.substring(1,13);
    RFID.println(tag);
    RFID.flush();
    noTone(buzzer);
    delay(1000);
    
  }else{
    Serial.println("Erro na comunicação com sensor");
  }
}

Este código está ótimo. Consigo ler a bagaça normalmente.

Entretanto, estou em java utilizando o seguinte código (completo em unica classe)

package meuMain;

import java.io.InputStream;
import java.io.OutputStream;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.util.Enumeration;
import static jdk.nashorn.internal.objects.NativeString.substring;

public class SerialTest implements SerialPortEventListener {
        public static String tagLida;
	SerialPort serialPort;
        /** A porta que usaremos normalmente */
	private static final String PORT_NAMES[] = {
			"/dev/tty.usbserial-A9007UX1", // Mac OS X
			"/dev/ttyUSB0", // Linux
			"COM4", // Windows
			};
	/** Fluxo de entrada bufferizado vindo da porta */
	private InputStream input;
	/** Fluxo de saída para a porta */
	private OutputStream output;
	/** Milissegundos para bloquear enquanto aguarda a abertura da porta */
	private static final int TIME_OUT = 2000;
	/** Bits por segundo padrão para a porta COM */
	private static final int DATA_RATE = 9600;
        public static String tag;
	public String initialize() {
		CommPortIdentifier portId = null;
		Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();

		// Faz iterações procurando pela porta
		while (portEnum.hasMoreElements()) {
			CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
			for (String portName : PORT_NAMES) {
				if (currPortId.getName().equals(portName)) {
					portId = currPortId;
					break;
				}
			}
		}

		if (portId == null) {
			//System.out.println("Could not find COM port.");
			return "Could not find COM port.";
		}

		try {
			// abre a porta serial, e usa o nome da classe para a appName
			serialPort = (SerialPort) portId.open(this.getClass().getName(),
					TIME_OUT);

			// define parâmetros da porta
			serialPort.setSerialPortParams(DATA_RATE,
					SerialPort.DATABITS_8,
					SerialPort.STOPBITS_1,
					SerialPort.PARITY_NONE);

			// abre os fluxos
			input = serialPort.getInputStream();
			output = serialPort.getOutputStream();

			// adiciona os ouvintes de eventos
			serialPort.addEventListener(this);
			serialPort.notifyOnDataAvailable(true);
		} catch (Exception e) {
			System.err.println(e.toString());
		}
                return tagLida;
	}

	/**
	 * Isso deverá ser chamado quando você parar de usar a porta
	 * Isso irá prevenir o travamento da porta em plataformas como Linux.
	 */
	public synchronized void close() {
		if (serialPort != null) {
			serialPort.removeEventListener();
			serialPort.close();
		}
	}

	/**
	 * Trata um evento na porta serial. Lê os dados e os imprime.
	 */
	public synchronized void serialEvent(SerialPortEvent oEvent) {//porta que
           
		if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
			try {
				int available = input.available();
				byte chunk[] = new byte[available];
				input.read(chunk, 0, available);
				// Os resultados mostrados são dependentes do codepage
                                tag = new String(chunk);
				//System.out.print(new String(chunk));
				//System.out.print(tag);
				
                                
			} catch (Exception e) {
				System.err.println(e.toString());
			}
		}
		// Ignore todos os outros eventTypes, mas você deve considerar o resto.
                System.out.print(tag);
	}

	public static void main(String[] args) throws Exception {
		SerialTest main = new SerialTest();
		main.initialize();
		System.out.println("Started");
                
	}
}

Só que é o seguinte… se eu printo apenas a TAG, ele printa normal e perfeitamente.
Mas, como eu preciso utilizar essa tag pra “mexer dados”, como por exemplo, inserí-la em um banco de dados, eu não consigo.
Uma vez que eu coloco qualquer tipo de String juntamente com o código, me traz um problema.

Apenas se eu colocar um println ja me traz da seguinte forma:

Started
3
2001
33C4
35E

3200
133C
435E


3
2001
33C4
35E

32
00133C435E

3200
133C
435E

Sendo que o correto é apenas o tamanho da tag <3200133C435E>
E se eu colocar uma string em baixo tem o seguinte resultado:

//codigo
System.out.print(tag);
System.out.print("TA bagaçado");

// resultado
Started
3TA bagaçado2001TA bagaçado33C4TA bagaçado35E
TA bagaçado320TA bagaçado0133TA bagaçadoC435TA bagaçadoE
TA bagaçado

Alguem já passou por esse problema ou tem alguma dica pra dar?

Estou usando a bib rxtxcomm e simplesmente to quebrando a cabeça ha alguns dias e nao consigo achar uma saída hehe

agradeço se alguem tiver algo a acrescentar

Abraços

Como les os dados da porta serie?

Ja pensaste em apenas copiar os dados do buffer da porta serie quando receberes X caracteres ou quando receberes um caracter em espcifico (normalmente um carriage return) ?

Tens de perceber que quando envias os dados, eles nao chegam todos ao mesmo tempo. Dai que tens de sincronizar o computador com o Arduino para isso funcionar.

Estou enfrentando o mesmo problema.

A ideia é ler os dados do rf id e os enviar a uma aplicação java, os dados chegam na tela de saida do java, porem assim como o seu caso, esses dados vem espalhados e pulando linha.

Esse foi o codigo usado no arduino, dei um lcd.print(conteudo.substring(1)); e o resultado saiu certinho, o problema esta mesmo na hora do hava receber, e no java estou a usar os mesmos dados que o seu, tentei outros métodos porem sem sucesso.

for (byte i = 0; i < mfrc522.uid.size; i++)
{
conteudo.concat(String(mfrc522.uid.uidByte < 0x10 ? " 0" : " "));
_ conteudo.concat(String(mfrc522.uid.uidByte*, HEX));_
_
}*_

* conteudo.toUpperCase();*
* Serial.println(conteudo.substring(1));*