Pessoal,
Estou com a seguinte duvida preciso mandar um string para a porta serial o metodo usado para enviar é esse:
publicvoidEnviarUmaString(byte[]cmd){if(Escrita==true){try{saida=porta.getOutputStream();System.out.println("FLUXO OK!");}catch(Exceptione){System.out.println("Erro.STATUS: "+e);}try{intnumBytes=0;entrada=newByteArrayInputStream(cmd);System.out.println("Enviando um byte para "+Porta);System.out.println("Enviando : ");while(entrada.available()>0){numBytes=entrada.read(cmd);Stringresult=newString(cmd);System.out.println("teste>>>"+result);}saida.write(cmd);Thread.sleep(100);saida.flush();}catch(Exceptione){System.out.println("Houve um erro durante o envio. ");System.out.println("STATUS: "+e);System.exit(1);}}else{System.exit(1);}}publicvoidrun(){try{Thread.sleep(5);}catch(Exceptione){System.out.println("Erro de Thred: "+e);}}
No main está assim:
publicclassExemplo_Hex{/** * @param args the command line arguments */publicstaticvoidmain(String[]args){// TODO code application logic hereStringteste,str,tela=null;teste=JOptionPane.showInputDialog("Digite o Comando");char[]chars=teste.toCharArray();StringBufferstrBuffer=newStringBuffer();for(inti=0;i<chars.length;i++){strBuffer.append(Integer.toHexString((int)chars[i]));}tela=strBuffer.toString();//Iniciando leitura serial SerialcomLeituraleitura=newSerialcomLeitura("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(InterruptedExceptionex){System.out.println("Erro na Thread: "+ex);}leitura.FecharCom();}}
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?
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();chararray[]="O rato roeu a roupa do Rei de Roma".toCharArray();for(inti=0;i<array.length();i++){byteb=(byte)array[i];intbb=(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.
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!
Willdoidao
Não sei se ajuda mas vou postar a classe inteira aqui, pq pelo que entendi já faz um tratamento para trabalhar em Hex:
publicclassSerialcomLeituraimplementsRunnable,SerialPortEventListener{publicstaticStringstringToHex(Stringstr){StringBufferbuff=newStringBuffer();for(inti=0;i<str.length();i++){charch=str.charAt(i);if(ch<0x10){buff.append('0');}buff.append(Integer.toHexString(ch&0xFF));}returnbuff.toString();}publicstaticStringstringToHex2(Stringbase){StringBufferbuffer=newStringBuffer();intintValue;for(intx=0;x<base.length();x++){intcursor=0;intValue=base.charAt(x);StringbinaryChar=newString(Integer.toBinaryString(base.charAt(x)));for(inti=0;i<binaryChar.length();i++){if(binaryChar.charAt(i)=='1'){cursor+=1;}}if((cursor%2)>0){intValue+=128;}buffer.append(Integer.toHexString(intValue)+" ");}returnbuffer.toString();}publicStringDadoslidos;publicintnodeBytes;privateintbaudrate;privateinttimeout;privateCommPortIdentifiercp;privateSerialPortporta;privateOutputStreamsaida;//private DataOutputStream saida; privateInputStreamentrada;privateThreadthreadLeitura;privatebooleanIDPortaOK;privatebooleanPortaOK;privatebooleanLeitura;privatebooleanEscrita;privateStringPorta;protectedStringpeso;publicvoidsetPeso(Stringpeso){this.peso=peso;}publicStringgetPeso(){returnpeso;}publicSerialcomLeitura(Stringp,intb,intt){this.Porta=p;this.baudrate=b;this.timeout=t;}publicvoidHabilitarEscrita(){Escrita=true;Leitura=false;}publicvoidHabilitarLeitura(){Escrita=false;Leitura=true;}publicvoidObterIdDaPorta(){try{cp=CommPortIdentifier.getPortIdentifier(Porta);if(cp==null){System.out.println(" Erro na porta ");IDPortaOK=false;System.exit(1);}IDPortaOK=true;}catch(Exceptione){System.out.println("Erro obtendo ID da porta: "+e);IDPortaOK=false;System.exit(1);}}publicvoidAbrirPorta(){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(Exceptione){PortaOK=false;System.out.println("Erro abrindo comunicação: "+e);System.exit(1);}}publicvoidLerDados(){if(Escrita==false){try{entrada=porta.getInputStream();}catch(Exceptione){System.out.println("Erro de stream: "+e);System.exit(1);}try{porta.addEventListener(this);}catch(Exceptione){System.out.println("Erro de listener: "+e);System.exit(1);}porta.notifyOnDataAvailable(true);try{threadLeitura=newThread(this);threadLeitura.start();run();}catch(Exceptione){System.out.println("Erro de Thred: "+e);}}}publicvoidEnviarUmaString(byte[]cmd){if(Escrita==true){try{saida=porta.getOutputStream();System.out.println("FLUXO OK!");}catch(Exceptione){System.out.println("Erro.STATUS: "+e);}try{intnumBytes=0;entrada=newByteArrayInputStream(cmd);System.out.println("Enviando um byte para "+Porta);System.out.println("Enviando : ");while(entrada.available()>0){numBytes=entrada.read(cmd);Stringresult=newString(cmd);System.out.println("teste>>>"+result);}saida.write(cmd);Thread.sleep(100);saida.flush();}catch(Exceptione){System.out.println("Houve um erro durante o envio. ");System.out.println("STATUS: "+e);System.exit(1);}}else{System.exit(1);}}publicvoidrun(){try{Thread.sleep(5);}catch(Exceptione){System.out.println("Erro de Thred: "+e);}}publicvoidserialEvent(SerialPortEventev){StringBufferbufferLeitura=newStringBuffer();intnovoDado=0;switch(ev.getEventType()){caseSerialPortEvent.BI:caseSerialPortEvent.OE:caseSerialPortEvent.FE:caseSerialPortEvent.PE:caseSerialPortEvent.CD:caseSerialPortEvent.CTS:caseSerialPortEvent.DSR:caseSerialPortEvent.RI:caseSerialPortEvent.OUTPUT_BUFFER_EMPTY:break;caseSerialPortEvent.DATA_AVAILABLE://Novo algoritmo de leitura. while(novoDado!=-1){try{novoDado=entrada.read();if(novoDado==-1){break;}bufferLeitura.append((char)novoDado);}catch(IOExceptionioe){System.out.println("Erro de leitura serial: "+ioe);}}//setPeso(new String(bufferLeitura)); Stringstr=newString(bufferLeitura);System.out.println(str);System.out.println(stringToHex(str));break;}}publicvoidFecharCom(){try{porta.close();}catch(Exceptione){System.out.println("Erro fechando porta: "+e);System.exit(0);}}publicStringobterPorta(){returnPorta;}publicintobterBaudrate(){returnbaudrate;}}
matheuslmota
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!
Essa transformação deve ser aplicada na hora de enviar a String para a porta Serial:
publicvoidEnviarUmaString(byte[]cmd){if(Escrita==true){try{saida=porta.getOutputStream();System.out.println("FLUXO OK!");}catch(Exceptione){System.out.println("Erro.STATUS: "+e);}try{intnumBytes=0;entrada=newByteArrayInputStream(cmd);System.out.println("Enviando um byte para "+Porta);System.out.println("Enviando : ");while(entrada.available()>0){chararray[]=cmd.toCharArray();//tratamento dos bytes - iniciofor(inti=0;i<array.length();i++){byteb=(byte)array[i];intbb=(int)b&0xFF;saida.write(bb);}//tratamento dos bytes - fimSystem.out.println("teste>>>"+result);}saida.write(cmd);Thread.sleep(100);saida.flush();}catch(Exceptione){System.out.println("Houve um erro durante o envio. ");System.out.println("STATUS: "+e);System.exit(1);}}else{System.exit(1);}}
Willdoidao
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 :
publicvoidEnviarUmaString(byte[]cmd){
matheuslmota
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.