Olá Pessoal.
Estou desenvolvendo uma aplicação que irá simular a comunicação entre duas portas seriais RS-232. Esta aplicação será idêntica ao HyperTerminal do Windows.
Usando a biblioteca java RxTx, as portas conseguem enviar e receber os dados corretamente através do evento (SerialEvent):
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 = inputPorta.read();
if(novoDado == -1)
{
break;
}
if('\r' == (char)novoDado)
{
bufferLeitura.append('\n');
}
else
{
bufferLeitura.append((char)novoDado);
}
}
catch(IOException ioe)
{
System.out.println("Erro de recepcao de dados: " + ioe);
}
}
setDataReceived(new String(bufferLeitura));
((ViewSerialConection) caller).textArea.append(getDataReceived());
break;
}
}
Consigo enviar e receber os dados de uma porta à outra sem problemas, mas não consigo setar os dados que estão sendo recebidos no TextBox da interface gráfica usando o evento acima (SerialEvent). Sempre que chamo a classe de conexao serial, passo a instância da interface para ter acesso ao Text e setar os valores.
O erro está sendo na linha:
((ViewSerialConnection) caller).textArea.append(getDataReceived());
onde caller é a instância da interface gráfica passado no construtor da classe de conexao Serial, getDataReceived() me retorna a String dos valores recebidos pela serial e ViewSerialConnection é o nome na classe da Interface Gráfica.
A mensagem de erro é a seguinte:
Exception in thread "Thread-1" java.lang.ClassCastException: subordSerialConection.ViewSerialConection$1 cannot be cast to subordSerialConection.ViewSerialConection
at subordSerialConection.ConexaoSerial.serialEvent(ConexaoSerial.java:314)
at gnu.io.RXTXPort.sendEvent(RXTXPort.java:732)
at gnu.io.RXTXPort.eventLoop(Native Method)
at gnu.io.RXTXPort$MonitorThread.run(RXTXPort.java:1575)
onde subordSerialConection.ViewSerialConection é o nome do pacote e da interface.
Alguém saberia me dizer, por gentileza, o que devo fazer para jogar os dados que estão sendo lidos na porta serial para a interface gráfica? Estou pesquisando e, pelo pouco que já sei a respeito, quando a aplicação está rodando, a interface roda em uma thread e este evento (SerialEvent) roda em outra thread. Se for mesmo isso, como faço para acessar a Thread da interface gráfica dentro da Thread do SerialEvent?
Minha interface gráfica é uma ViewPart, criada pelo Eclipse RCP.
Alguém poderia me ajudar??
Abs.