Java - PROBLEMA con escritura con caracteres de escape "\u" puerto serie

   
Vista:

PROBLEMA con escritura con caracteres de escape "\u" puerto serie

Publicado por javi (4 intervenciones) el 29/01/2018 16:23:59
Hola a todos, estoy programando una pequeña aplicación que y recibe datos a través del puerto serie, para ello, hasta ahora todas las cadenas habían sido en String puro y duro, pero ahora estamos empezando con un modo un poco mas avanzado, y tanto el envió como la recepción de datos se ha de hacer en hexadecimal, dudo que vaya a tener problemas con la recepción, puesto que ya he creado funciones de conversión, pero no consigo enviar información de forma correcta, he leído, que la sentencia para enviar códigos de escape es "\u", mi problema es que esto no se puede concatenar con variables, puesto que estas obligado a que esto tenga una longitud de 4, es decir:
obj.writeData("\u007E") se podría enviar sin problemas, pero
String cadena="007E";
obj.writeData("\u"+cadena);
da error al no saber la longitud de la variable.
ojala me podáis ayudar, os pego mi código, ANTE TODO MUCHAS GRACIAS POR TODO!







/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package remoto_proemisa;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.TooManyListenersException;
import javax.comm.CommPort;
import javax.comm.CommPortIdentifier;
import javax.comm.PortInUseException;
import javax.comm.SerialPort;
import javax.comm.SerialPortEvent;
import javax.comm.SerialPortEventListener;
import javax.comm.UnsupportedCommOperationException;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
import static sun.security.krb5.Confounder.bytes;

/**
*
* @author jmontañes
*/
public class Remoto_Proemisa implements SerialPortEventListener {
static Enumeration ports;
static HashMap portMap = new HashMap();
static CommPortIdentifier selectedPortIdentifier;
static SerialPort serialPort;
static boolean connected;
static InputStream input;
static OutputStream output;
static Interfaz i;
static Timer timer = new Timer();
static TimerTask timerTask;
static boolean noGuardadas;
static String cadenaRecepcion;
//GIOVYNET
static Remoto_Proemisa obj;

static Luminaria luminaria;
static VisualBasico vBasico;
static VisualAvanzado vAvanzado;


public static void main(String[] args) throws Exception {
noGuardadas=false;
obj = new Remoto_Proemisa();
ArrayList<String> puertos=obj.busquedaPuertosCOM();
i= new Interfaz(puertos);
i.pack();
//3- decimos que la ventana sea visible
i.setVisible(true);
i.botonBasico.setEnabled(false);
i.botonAvanzado.setEnabled(false);
cadenaRecepcion="";
i.setTitle("Control Remoto Proemisa");
i.botonConectar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
connect(String.valueOf(i.selectPuertos.getSelectedItem()));
try {
if (obj.connected == true) {
if (obj.initIOStream() == true) {
obj.initListener();
//se comprueba la conexion
cadenaRecepcion="";
//se vacia la cadena
obj.writeData("JA");
//se escribe la primera sentencia para iniciar la recepción de datos
luminaria=new Luminaria();
}
}
} catch (Exception ex) {
Logger.getLogger(Remoto_Proemisa.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
i.botonBasico.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
vBasico= new VisualBasico();
asignarVariablesBasico(vBasico,luminaria);
vBasico.pack();
vBasico.setVisible(true);
}
});
i.botonAvanzado.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//vAvanzado= new VisualAvanzado();
//asignarVariablesAvanzado(vAvanzado,luminaria);
//vAvanzado.pack();
//vAvanzado.setVisible(true);
cierraModoAvanzado();
}
});
i.botonDesconectar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
disconnect();
}
});
i.bPrueba.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// char[] envio={convertirHexadecimalADecimal("7E"),convertirHexadecimalADecimal("00"),convertirHexadecimalADecimal("0A"),convertirHexadecimalADecimal("00"),convertirHexadecimalADecimal("00"),convertirHexadecimalADecimal("00"),convertirHexadecimalADecimal("00"),convertirHexadecimalADecimal("00"),convertirHexadecimalADecimal("00"),convertirHexadecimalADecimal("00"),convertirHexadecimalADecimal("00"),convertirHexadecimalADecimal("00"),convertirHexadecimalADecimal("00"),convertirHexadecimalADecimal("00"),convertirHexadecimalADecimal("00"),convertirHexadecimalADecimal("00"),convertirHexadecimalADecimal("00"),convertirHexadecimalADecimal("00"),convertirHexadecimalADecimal("00"),convertirHexadecimalADecimal("F5")};
char[] envio;
//envio[0]=convertirHexadecimalADecimal("7E");
String cadena="7E001000000000000000000000000000000000EF";
for(int i=0;i<cadena.length();i++){
//String bite=cadena.charAt(i);
//String.format("%04x", (int) ch);
byte b=(byte) (Integer.parseInt(cadena.charAt(i)+"",16) & 0xff);
// int c1=Integer.parseInt(bite, 16);
// char c2 = (char) c1;
//System.out.print("1-->"+c1+"\n");
System.out.print("2-->"+b+"\n");
obj.writeData("\u00"+"");
}
byte[] b=cadena.getBytes(Charset.forName("UTF-8"));
System.out.print("Envio-->"+Arrays.toString(b));



}
});
/* i.botonDesconectar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
obj.disconnect();
activador(false, i);
}

});*/









public static void activador(boolean activar,Interfaz i){
/*Component[] components=i.panelLuminaria.getComponents();
for(int o = 0; o < components.length; o++) {
components[o].setEnabled(activar);
}*/
}

//------------------------------------------------------------------------------PUERTO SERIE Y CONEXION--------------------------------------------------------------------//

public static void connect(String com){
String puerto = com;
selectedPortIdentifier = (CommPortIdentifier) portMap.get(puerto);
CommPort commPort = null;
try {
commPort = selectedPortIdentifier.open("Send Sms Java", 100);
serialPort = (SerialPort) commPort;
setSerialPortParameters();
connected = true;
System.out.println("conectado exitosamente a puerto " + puerto);
} catch (PortInUseException e) {
System.out.println("Puerto en uso.");
} catch (Exception e) {
System.out.println("Error al abrir puerto.");
}
}
private static void setSerialPortParameters() throws IOException {
int baudRate = 9600;
try {
serialPort.setSerialPortParams(baudRate,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
serialPort.setFlowControlMode(
SerialPort.FLOWCONTROL_NONE);
} catch (UnsupportedCommOperationException ex) {
throw new IOException("Unsupported serial port parameter");
}
}
public boolean initIOStream() {
boolean successful = false;
try {
//
input = serialPort.getInputStream();
output = serialPort.getOutputStream();
successful = true;
return successful;
} catch (IOException e) {
System.out.println("Error al abrir Stream.");
return successful;
}
}
public void initListener() {
try {
serialPort.addEventListener(this);
serialPort.notifyOnDataAvailable(true);
System.out.println("Listo..");
} catch (TooManyListenersException e) {
System.out.println("Demasiados escuchas.");
}
}
public static void writeData(String aenviar) {
try {
output.write(aenviar.getBytes(Charset.forName("UTF-8")));
} catch (IOException ex) {
System.out.println("Error al enviar informacion.");
}
}
public static void disconnect() {
try {
//writeData("GOODBYE");
serialPort.removeEventListener();
serialPort.close();
input.close();
output.close();
connected = false;
System.out.println("Desconectado.");
} catch (Exception e) {
System.out.println("Error al desconectar.");
}
}
//------------------------------------------------------------------------------AVANZADO--------------------------------------------------------------------//
private static String completaBytes(String pares){
String respuesta=pares;
for(int i=pares.length();i<19;i++){
respuesta=respuesta+="\u0000";
}
System.out.print("completaBytes "+respuesta+"\n");
return respuesta;
}
private static ArrayList<String> separaDatos(String completo){
ArrayList<String> array = new ArrayList();
array.add(completo.charAt(2)+""+completo.charAt(3)+""+completo.charAt(4)+""+completo.charAt(5));
String resto="";
for (int i=6; i<completo.length();i++){
resto+=completo.charAt(i);
}

array.add(resto);
System.out.print("Array0 "+array.get(0)+"\n");
System.out.print("Array1 "+array.get(1)+"\n");
return array;
}
private static String calculaChecksum(String cmd,String datos){
String chk="";
int cmdOperacion=convertirHexadecimalADecimal(cmd);
int datosOperacion=convertirHexadecimalADecimal(datos);
int restultado=convertirHexadecimalADecimal("FF")-(cmdOperacion+datosOperacion);
chk=restultado+"";
chk=convertirDecimalAHExadecimal(Integer.parseInt(chk));
chk=chk.toUpperCase();
System.out.print("CHK "+chk+"\n");
return chk;
}
//------------------------------------------------------------------------------CONVERSORES--------------------------------------------------------------------//
private static String convertirAsciiAHexadecimal(String asciiStr) {
char[] chars = asciiStr.toCharArray();
StringBuilder hex = new StringBuilder();
for (char ch : chars) {
String resultado=Integer.toHexString((int) ch);
// con esto evitamos que los valores que bajen de 10 se guarden con un unico caracter, lo cual provoca fallos
if(resultado.length()==1)
resultado="0"+resultado;
hex.append(resultado);

}
System.out.println("aqui="+hex.toString());
return hex.toString();
}
private static String convertirHexadecimalAAscii(String hexStr) {
StringBuilder output = new StringBuilder("");

for (int i = 0; i < hexStr.length(); i += 2) {
String str = hexStr.substring(i, i + 2);
output.append((char) Integer.parseInt(str, 16));
}

return output.toString();
}
private static String conversorSegundosAtiempo(int num){
int hor,min,seg;
String hors,mins,segs;
hor=num/3600;
min=(num-(3600*hor))/60;
seg=num-((hor*3600)+(min*60));
if(hor<10){
hors="0"+hor;
}else hors=""+hor;
if(min<10){
mins="0"+min;
}else mins=""+min;
if(seg<10){
segs="0"+seg;
}else segs=""+seg;
return hors+":"+mins+":"+segs;

}
private static int convertirHexadecimalADecimal(String str) {
String strHexa = "0123456789ABCDEF";
str = str.toUpperCase();
int temp = 0;
for(int a = 0; a < str.length(); a++)
{
char h = str.charAt(a);
int d = strHexa.indexOf(h);
temp = 16 * temp + d;
}
return temp;
}
private static String convertirDecimalAHExadecimal(int num){
return Integer.toHexString(num);
}
public static void abreModoAvanzado(){
obj.writeData("++");
}
public static void cierraModoAvanzado(){
obj.writeData("++++++++++++++++++++");
}
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

PROBLEMA con escritura con caracteres de escape "\u" puerto serie

Publicado por Tom (1223 intervenciones) el 29/01/2018 18:42:47
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

PROBLEMA con escritura con caracteres de escape "\u" puerto serie

Publicado por javi (4 intervenciones) el 30/01/2018 17:09:37
muchas gracias, SOLUCIONADO
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

PROBLEMA con escritura con caracteres de escape "\u" puerto serie

Publicado por SuperIndio (11 intervenciones) el 30/01/2018 16:03:41
Antes que nada, impresionante tu proyecto, de vez en cuando salen estos posting
muy bueno...
No sera mejor pasalo a hexa a traves de una metodo

PD: cuando postees codigo ponele formato codigo seleccionas el codigo y luego icono </>

1
2
3
4
5
6
7
Use DatatypeConverter.printHexBinary():
 
public static String toHexadecimal(String text) throws UnsupportedEncodingException
{
    byte[] myBytes = text.getBytes("UTF-8");
    return DatatypeConverter.printHexBinary(myBytes);
}
Ejemlo:
1
2
3
System.out.Println(toHexadecimal("Holis"));
 
.....send(toHexadecimal("Holis"))
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

PROBLEMA con escritura con caracteres de escape "\u" puerto serie

Publicado por javi (4 intervenciones) el 30/01/2018 17:08:20
Muchas Gracias, al final lo solucione, con estas dos funciones:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void envioHexadecimal(String comando){
    String cadena=completaBytes(comando);
    cadena+=calculaChecksum(separaDatos(cadena).get(0), separaDatos(cadena).get(1));
    byte[] b = new byte[cadena.length()/2];
    int cont=0;
    for(int i=0;i<cadena.length();i+=2){
        b[cont]=(byte) (Integer.parseInt(cadena.charAt(i)+""+cadena.charAt(i+1),16) & 0xff);
        cont++;
    }
    obj.writeDataBytes(b);
}
public static void writeDataBytes(byte[] aenviar) {
    try {
        output.write(aenviar);
    } catch (IOException ex) {
        System.out.println("Error al enviar informacion.");
    }
}

con esto se lo come, el problema no era pasarlo a hexadecimal, eso ya lo hacia, el problema es q el puerto serie lo recibiese como bytes, con caracteres de escape, ahora gracias al array de bytes convertidos ya funciona, muchas gracias por todo

PD: muchísimas gracias, tanto por el cumplido del código como por la ayuda;
en cuanto a lo del meter el texto como codigo perdona jajaj me registre ayer para ver si daba con el problema, y finalmente entre la respuesta del primer chico y un poco de astucia programadora ya esta!!

AHORA A SEGUIR!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Revisar política de publicidad