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("++++++++++++++++++++");
}
}
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("++++++++++++++++++++");
}
}
- REMOTO.rar(5,7 KB)
Valora esta pregunta


0