Só que C usa o padrão ASCII(posso estar enganado, mas em http://pt.wikipedia.org/wiki/Linguagem_C diz que esta usa 8 bits para os chars e não 16 como em JAVA que é unicode). Como fazer que estas duas tecnologias sejam compatíveis?
Estudo de Caso:
Estou fazendo um sistema que tem parte em pcs e parte em placas controladas por microcontroladores ( espécie de computador imbutido num único chip). A parte PC é java, e a parte dos microcontroladores é programada em C. A idéia, era fazer que a placa controle dispositivos eletrônicos a partir de strings passadas do computador ( que faz a GUI). Chegando na placa via serial, o microcontrolador tenta interpretar essa string e faz determinadas ações segundo as ordens passadas. Agora, se eu passo um caractere em java, eu envio 16 pulsos ao invez de 8. O controlador recebe 16 pulsos e intende como 2 caracteres! Como fazer que essas duas tecnologias sejam compatíveis?
Não use strings e sim arrays de bytes. Faça a conversão de strings para arrays de bytes no próprio Java, que é mais simples. Exemplo:
voidnativeRotinaEmC(byte[]bytes);// isto você codifica usando JNI em CvoidRotinaEmJava(stringstr){RotinaEmC(str.toByteArray("ISO-8859-1");// a conversão de strings para arrays de bytes é feita pelo Java}
S
shamanpyro
Obrigado! O problema é que estou usando a biblioteca RXTX para comunicação serial, e ela recebe como parâmetro uma string. E agora?
S
shamanpyro
bom, modifiquei o método de envio para aceitar bytes… mas qndo eu envio os bytes e jogo na tela pra ver o que eu to enviando a string:
L2Liga fica: [B@e0e1c6
??? pq isso?
T
thingol
Você precisa converter de volta o array de bytes para uma string. O método “toString” dos arrays mostra exatamente isso, portanto você tem de usar o construtor de String que aceita um array de bytes
(ou seja,
Desculpe o chute thingol e shamanpyro mas e se você transformasse essa lista de bytes em uma lista de caracteres hexa? Acho que dessa maneira vc consegue passar a lista em forma de strings.
O problema que eu vejo nessa minha idéia é vc ter que converter a lista de hexas em bytes novamente no microcontrolador isso vai aumentar seu código e consequentimente aumentar o consumo de memória.
S
shamanpyro
Muito obrigado!
funcionou pra mostrar na tela direitinho. Mas, vejo que fiz errado: para converter pra array de Bytes useu getBytes fiz da senguinte forma:
StringOrdem="L2Liga";// a ordem a ser excecutadaserialEscrita.EnviarUmArrayDeByte(Ordem.getBytes());publicvoidEnviarUmArrayDeByte(byte[]msg){// não se preocutry{saida=porta.getOutputStream();System.out.println("FLUXO OK!");}catch(Exceptione){System.out.println("Erro.STATUS: "+e);}try{Strings=newString(msg,"ISO-8859-1");System.out.println("Enviando um byte para "+Porta);System.out.println("Enviando : "+s);saida.write(msg);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);}}
Eu tinha pensado que esse iSO-8859-1 que vc citou em
Desculpe o chute thingol e shamanpyro mas e se você transformasse essa lista de bytes em uma lista de caracteres hexa? Acho que dessa maneira vc consegue passar a lista em forma de strings.
tipo, o pic que eu to usando é o 16f628A, ele não é tão fraco assim de memória, mas ainda sim é muito limitada. Fiz mo trampo pra diminuir os procesos: consegui fazer duas comparações pra ligar uma lampada ou ventilador, contra 10 feitas pelo concorrente ;), além da minha string ter 4 dígitos e a dele 12 Oo… Fiz todo esse esforço pq java é um pouco mais lento então to tetando compensar no processamento do pic. Mas, obrigado pela sugestão, testarei ela e verei qual tem melhor desempenho ^^.
A propósito: eu não consegui usar o toByteArray… precisa de algum jar?
S
shamanpyro
Obrigado a todos pela ajuda
ViniGodoy
Uma coisa que me deixou decepcionado com o Java é o fato das classes de stream ou channel não terem métodos para integrar com C, em especial, métodos para transmitir ou receber dados unsigned.
S
shamanpyro
realmente, to tendo que fazer um protocolo só pra isso funcionar oO. Terminando eu disponibilizo aqui. ( protocolo é meio forçado, é mais uma funçãozinha XD… pq convertendo passa os dados de boa eu acho)