Pessoal,
Estou com a seguinte duvida preciso mandar um string para a porta serial o metodo usado para enviar é esse:
[code] public void EnviarUmaString(byte[] cmd) {
if (Escrita == true) {
try {
saida = porta.getOutputStream();
System.out.println("FLUXO OK!");
} catch (Exception e) {
System.out.println("Erro.STATUS: " + e);
}
try {
int numBytes = 0;
entrada = new ByteArrayInputStream(cmd);
System.out.println("Enviando um byte para " + Porta);
System.out.println("Enviando : ");
while (entrada.available() > 0) {
numBytes = entrada.read(cmd);
String result = new String(cmd);
System.out.println("teste>>>" + result);
}
saida.write(cmd);
Thread.sleep(100);
saida.flush();
} catch (Exception e) {
System.out.println("Houve um erro durante o envio. ");
System.out.println("STATUS: " + e);
System.exit(1);
}
} else {
System.exit(1);
}
}
public void run() {
try {
Thread.sleep(5);
} catch (Exception e) {
System.out.println("Erro de Thred: " + e);
}
}[/code]
No main está assim:
[code]public class Exemplo_Hex {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
String teste, str, tela = null;
teste = JOptionPane.showInputDialog("Digite o Comando");
char[] chars = teste.toCharArray();
StringBuffer strBuffer = new StringBuffer();
for (int i = 0; i < chars.length; i++) {
strBuffer.append(Integer.toHexString((int) chars[i]));
}
tela = strBuffer.toString();
//Iniciando leitura serial
SerialcomLeitura leitura = new SerialcomLeitura("COM1", 4800, 0);
leitura.HabilitarEscrita();
leitura.EnviarUmaString(chars);
leitura.HabilitarLeitura();
leitura.ObterIdDaPorta();
leitura.AbrirPorta();
leitura.LerDados();
//Controle de tempo da leitura aberta na serial
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
System.out.println("Erro na Thread: " + ex);
}
leitura.FecharCom();
}
}[/code]
Sei que é o tipo de string que estou tentando enviar está errado (pelo menos eu acho que é isso), se estiver certo como arrumar isso?
Caso esteja errado minha suposição o que seria o erro?
public void EnviarUmaString(String message){
String msg ;
msg =message;
try{
saida.write(msg.getBytes());
// Thread.sleep(100);
saida.flush();
}catch(IOException e){
System.out.println("ERRRROOOOOOO");
}
para testar:
EnviarUmaString("isso é um teste");
sds
j.silvestre
Tu tem que enviar vetores de bytes para a porta serial.
Tu converte a String em um vetor de chars e envia cada char como um byte.
Como o char assume valores que vão de -127 à 128 e você provavelmente irá trabalhar com dispositivos que um byte varia de 0 à 255, você pode usar a seguinte técnica:
...
saida = porta.getOutputStream();
char array[] = "O rato roeu a roupa do Rei de Roma".toCharArray();
for(int i = 0; i < array.length(); i++)
{
byte b = (byte)array[i];
int bb = (int)b & 0xFF;
saida.write(bb);
}
saida.flush();
...
Com essa pequena gambiarra você pode enviar byters que vão de 0 à 255, que é o que a maioria dos dispositivos seriais aceitam.
Abs.
matheuslmota,
Desculpa minha ignorância mas aonde faço essa transformação? no main ou dentro da função q envia?
Pq a ideia é pegar um comando do cliente, transformo em Hexadecimal e envio para a placa, aonde coloco esse comando e como passo a string para ser enviado, mas o que vc falou faz todo sentido falta agora saber como fazer, mas muito obrigado pela ajuda!
Não sei se ajuda mas vou postar a classe inteira aqui, pq pelo que entendi já faz um tratamento para trabalhar em Hex:
[code]public class SerialcomLeitura implements Runnable, SerialPortEventListener {
public static String stringToHex(String str) {
StringBuffer buff = new StringBuffer();
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (ch < 0x10) {
buff.append('0');
}
buff.append(Integer.toHexString(ch & 0xFF));
}
return buff.toString();
}
public static String stringToHex2(String base) {
StringBuffer buffer = new StringBuffer();
int intValue;
for (int x = 0; x < base.length(); x++) {
int cursor = 0;
intValue = base.charAt(x);
String binaryChar = new String(Integer.toBinaryString(base.charAt(x)));
for (int i = 0; i < binaryChar.length(); i++) {
if (binaryChar.charAt(i) == '1') {
cursor += 1;
}
}
if ((cursor % 2) > 0) {
intValue += 128;
}
buffer.append(Integer.toHexString(intValue) + " ");
}
return buffer.toString();
}
public String Dadoslidos;
public int nodeBytes;
private int baudrate;
private int timeout;
private CommPortIdentifier cp;
private SerialPort porta;
private OutputStream saida;
//private DataOutputStream saida;
private InputStream entrada;
private Thread threadLeitura;
private boolean IDPortaOK;
private boolean PortaOK;
private boolean Leitura;
private boolean Escrita;
private String Porta;
protected String peso;
public void setPeso(String peso) {
this.peso = peso;
}
public String getPeso() {
return peso;
}
public SerialcomLeitura(String p, int b, int t) {
this.Porta = p;
this.baudrate = b;
this.timeout = t;
}
public void HabilitarEscrita() {
Escrita = true;
Leitura = false;
}
public void HabilitarLeitura() {
Escrita = false;
Leitura = true;
}
public void ObterIdDaPorta() {
try {
cp = CommPortIdentifier.getPortIdentifier(Porta);
if (cp == null) {
System.out.println(" Erro na porta ");
IDPortaOK = false;
System.exit(1);
}
IDPortaOK = true;
} catch (Exception e) {
System.out.println("Erro obtendo ID da porta: " + e);
IDPortaOK = false;
System.exit(1);
}
}
public void AbrirPorta() {
try {
porta = (SerialPort) cp.open("SerialComLeitura", timeout);
PortaOK = true;
//configurar parâmetros
porta.setSerialPortParams(baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
porta.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
} catch (Exception e) {
PortaOK = false;
System.out.println("Erro abrindo comunicação: " + e);
System.exit(1);
}
}
public void LerDados() {
if (Escrita == false) {
try {
entrada = porta.getInputStream();
} catch (Exception e) {
System.out.println("Erro de stream: " + e);
System.exit(1);
}
try {
porta.addEventListener(this);
} catch (Exception e) {
System.out.println("Erro de listener: " + e);
System.exit(1);
}
porta.notifyOnDataAvailable(true);
try {
threadLeitura = new Thread(this);
threadLeitura.start();
run();
} catch (Exception e) {
System.out.println("Erro de Thred: " + e);
}
}
}
public void EnviarUmaString(byte[] cmd) {
if (Escrita == true) {
try {
saida = porta.getOutputStream();
System.out.println("FLUXO OK!");
} catch (Exception e) {
System.out.println("Erro.STATUS: " + e);
}
try {
int numBytes = 0;
entrada = new ByteArrayInputStream(cmd);
System.out.println("Enviando um byte para " + Porta);
System.out.println("Enviando : ");
while (entrada.available() > 0) {
numBytes = entrada.read(cmd);
String result = new String(cmd);
System.out.println("teste>>>" + result);
}
saida.write(cmd);
Thread.sleep(100);
saida.flush();
} catch (Exception e) {
System.out.println("Houve um erro durante o envio. ");
System.out.println("STATUS: " + e);
System.exit(1);
}
} else {
System.exit(1);
}
}
public void run() {
try {
Thread.sleep(5);
} catch (Exception e) {
System.out.println("Erro de Thred: " + e);
}
}
public void serialEvent(SerialPortEvent ev) {
StringBuffer bufferLeitura = new StringBuffer();
int novoDado = 0;
switch (ev.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:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
case SerialPortEvent.DATA_AVAILABLE:
//Novo algoritmo de leitura.
while (novoDado != -1) {
try {
novoDado = entrada.read();
if (novoDado == -1) {
break;
}
bufferLeitura.append((char) novoDado);
} catch (IOException ioe) {
System.out.println("Erro de leitura serial: " + ioe);
}
}
//setPeso(new String(bufferLeitura));
String str = new String(bufferLeitura);
System.out.println(str);
System.out.println(stringToHex(str));
break;
}
}
public void FecharCom() {
try {
porta.close();
} catch (Exception e) {
System.out.println("Erro fechando porta: " + e);
System.exit(0);
}
}
public String obterPorta() {
return Porta;
}
public int obterBaudrate() {
return baudrate;
}
}[/code]
[quote=Willdoidao]matheuslmota,
Desculpa minha ignorância mas aonde faço essa transformação? no main ou dentro da função q envia?
Pq a ideia é pegar um comando do cliente, transformo em Hexadecimal e envio para a placa, aonde coloco esse comando e como passo a string para ser enviado, mas o que vc falou faz todo sentido falta agora saber como fazer, mas muito obrigado pela ajuda![/quote]
Essa transformação deve ser aplicada na hora de enviar a String para a porta Serial:
[code] public void EnviarUmaString(byte[] cmd) {
if (Escrita == true) {
try {
saida = porta.getOutputStream();
System.out.println("FLUXO OK!");
} catch (Exception e) {
System.out.println("Erro.STATUS: " + e);
}
try {
int numBytes = 0;
entrada = new ByteArrayInputStream(cmd);
System.out.println("Enviando um byte para " + Porta);
System.out.println("Enviando : ");
while (entrada.available() > 0) {
char array[] = cmd.toCharArray();
//tratamento dos bytes - inicio
for(int i = 0; i < array.length();i++)
{
byte b = (byte)array[i];
int bb = (int)b & 0xFF;
saida.write(bb);
}
//tratamento dos bytes - fim
System.out.println("teste>>>" + result);
}
saida.write(cmd);
Thread.sleep(100);
saida.flush();
} catch (Exception e) {
System.out.println("Houve um erro durante o envio. ");
System.out.println("STATUS: " + e);
System.exit(1);
}
} else {
System.exit(1);
}
}
[/code]
matheuslmota,
Cara pode ser burrice da minha parte mas ainda não consegui porque estava lendo o que vc mandou e comparei com o que fiz até agora no main fiz algo parecido olha:
teste = JOptionPane.showInputDialog("Digite o Comando");
char[] chars = teste.toCharArray();
StringBuffer strBuffer = new StringBuffer();
for (int i = 0; i < chars.length; i++) {
strBuffer.append(Integer.toHexString((int) chars[i]));
}
tela = strBuffer.toString();
- ou - parecido com o tratamento que você passou:
char array[] = cmd.toCharArray();
//tratamento dos bytes - inicio
for(int i = 0; i < array.length();i++)
{
byte b = (byte)array[i];
int bb = (int)b & 0xFF;
saida.write(bb);
}
//tratamento dos bytes - fim
Faço esse tratamento antes para transformar em Hex e enviar para serial pq o sensor só lê Hex, neste caso pergunto o que faço tiro esse tratamento dai e coloco lá dentro da função de envio?
E se puder realizar aqui como fazer? e como passar para a função?
Pq se fosse uma string seria:
leitura.EnviarUmaString(tela);
Já em array[], não faço ideia de como enviar para lá, já que a classe começa com :
public void EnviarUmaString(byte[] cmd) {
Hum, entendi. Nesse caso, eu acho que seria mais interessante você capturar a String que representa o comando e enviá-la para o método enviarString.
O método enviarString deve receber uma String como parâmetro e não um vetor de bytes. Fazendo dessa maneira funciona. Qualquer dúvida pergunta ae.
Abs.