/ / RXTX Java librairie bug - java, arduino, rxtx

RXTX Java librairie bug - java, arduino, rxtx

Nie jestem całkiem dobry po angielsku, więc spróbujębądź dla ciebie jasny. Obecnie pracuję nad projektem obejmującym wiele programów. Napisałem program kontroli Arduino, który pozwala mi zarządzać siecią czujników za pomocą poleceń. Na przykład mogę dodać czujniki, wpisując polecenie "dodaj" itd ...

Napisałem również API Java dla mikrokontrolerado gromadzenia danych czujnika (działa z każdym typem mikrokontrolerów), który jest w stanie wysłać plik poleceń do mikrokontrolera, aby odzyskać otrzymane dane i zapisać je w pliku w wybranym przeze mnie formacie (JSON, XML, PostScript, bajtode ...) i może również wysłać go pod nagłówkiem http na adres IP ...

Mam następujący problem:

Kiedy wysyłam polecenie z mojego programu Java do mojego mikrokontrolera, program Java czasami nie jest w stanie odebrać odpowiedzi wykonania komendy, co powoduje awarię:

Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version   = RXTX-2.1-7
Received line : I: Tab cleared.
Received line : I: Setup terminated
|MicroController.java->messageReceived|: recieved response : I: Setup terminated
Send : add t1 2 3
Received line : I:|Main loop| command received :add t1 2 3
Received line : I:|Main loop| command add t1 2 3 in execution ...
Received line : I:|Main loop| command add t1 2 3 executed.
Received line : I:|Main loop| return code 0 sent.

Jak widać, mikrokontroler wysłał kod powrotu "0", ale Java go nie odebrała.

Napisałem własną metodę send () i receive ():

/**
* Send message.
*
* @param str String to send.
*
* @throws IOException IO error.
* @throws InterruptedException
*/
public void sendMessage(String str)
throws IOException, InterruptedException
{
System.out.println("Send : " + str);

// Send the command.
output.write(str.getBytes());
output.flush();
}

/**
* Handle input event on the serial port.
*
* @param oEvent Event receives.
*/
private synchronized void processReceivedEvent(SerialPortEvent oEvent)
{
if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE)
{
try
{
// Wait input to be ready (mandatory, exception o/w).
while (!input.ready())
{
Thread.sleep(1);
}
String inputLine = input.readLine();
System.out.println("Received line : " + inputLine);

// Notify listener.
if ((listener != null) && (inputLine != null))
listener.messageReceived(inputLine);
}
catch (Exception e)
{
if (port != null)
e.printStackTrace();
}
}
}

Może mam jakiś błąd synchronizacji, który sprawiłbłąd odczytu szeregowego, ale jestem ciekawy, czy istnieje jakikolwiek konflikt między moją metodą wysyłania i odbierania z metodą seryjnej librairie ...

Dzięki.

Odpowiedzi:

0 dla odpowiedzi № 1

W końcu rozwiązałem ten problem. Miałem BufferedReader w moim kodzie, który zawiesił blokowanie programu. Z powodu Serial Link i tego bezużytecznego BufferedReadera (bezużytecznego w moim programie, oczywiście), było zbyt wiele warstw między wiadomością wysłaną przez mikrokontroler i jego odbiorem przez program Java, więc przez większość czasu była ona ustawiona na timeout.

Wstawiam prosty InputStream, aby ominąć warstwy i opracuję własną metodę czytania.

Ale mam też ciągły problem:

Po zakończeniu konfiguracji mikrokontrolera wysyłany jest następujący komunikat do programu Java: "I: Setup zakończony".

Jeśli program Java nie odbierze tego komunikatu, zostanie przekroczony limit czasu. Czasami jednak program Java otrzymał "termI: Setup zakończony", z kilkoma znakami przed "I:".

Nie wiem skąd to może przyjść ... Jeśli masz jakąś wskazówkę, będzie miło.

Dzięki !