[Java Comm API] Problem z komunikacją z anteną GPS

0

Cześć !

Dysponuję anteną GPS ANTARIS podłączaną do gniazda USB. Mam do niej oprogramowanie, dzięki któremu widzę, że antenka działa w porządku i wysyła na port COM7 pakiety zgodne z protokołem NMEA. Wysyła sobie takie pakiety co 2 sekundy.

Chcę odczytywać te pakiety z pominięciem oprogramowania, pisząc do tego własny program w Javie.
Wzorując się na programie opisanym w dokumentacji, a dostępnym tutaj : http://java.sun.com/developer/releases/javacomm/SimpleRead.java
napisałem własny kod. Różni się on od bazowego tylko tym, że od razu otwieram port "COM7", a nie szukam portu "defaultowego".
Parametry portu szeregowego ustawiam takie same jak w przykładzie, ale tak się szczęśliwie składa, że zgadzają się z parametrami anteny (8 bitów danych, 1 stopu, 0 parzystości).

Mój program bez zarzutów przechodzi przez linię :
<code = java>
com = CommPortIdentifier.getPortIdentifier("COM7");

,
bez zarzutu działa otwieranie portu :
<code = java>
thePort = com.open("moj program", 1000);

port jest rzeczywiście szeregowy i ustawiam mu poprawne parametry, pobieram strumień, szykuję listenera:
<code = java>
if (portType == com.PORT_SERIAL) {
SerialPort sp = (SerialPort)thePort;
try {
inputStream = sp.getInputStream();
} catch (IOException e) {System.out.println("buba");}

    try {
       sp.addEventListener(this);
   } catch (TooManyListenersException e) {System.out.println("buba");}

   sp.notifyOnDataAvailable(true);
        try {
            
            sp.setSerialPortParams(4800,
                    SerialPort.DATABITS_8,
                    SerialPort.STOPBITS_1,
                    SerialPort.PARITY_NONE);
        } catch (UnsupportedCommOperationException ucoe) {
            ucoe.printStackTrace();
            return;
        }
    }


Jednak na tym miłe rzeczy się kończą - nic nie jest sczytywane z portu, choćbym czekał na jakiś sygnał kilka minut, to ani razu nie zostanie wywołana funkcja serialEvent(), ani razu nie zajdzie zdarzenie, wygląda to tak, jakby antenka nic nie wysyłała ...
Z czego to może wynikać?
Co robię nie tak?

Z góry wielkie dzięki, 
Kamyk
0

Strzelam w ciemno... pokazałeś kod odpowiadający za obsługę zdarzenia, ale czy dodałeś listnera? Mnie często zdarzało się o tym zapomnieć i w efekcie obsługa nigdy nie była wywołana.

0

Tak, listener jest.
<code = java>sp.addEventListener(this);


Powiem więcej, próbowałem też czytać bez użycia listnera, sam sobie wątek zrobiłem, w którym co jakiś czas sprawdzałem metodą available(), czy są dane. 
Nigdy nie było.
Metoda read zwracała zawsze 0 - zero sczytanych znaków.

 Zastanawiam się, czy nie powinienem jakoś pogrzebać w klasie CommDriver, ale w ani jednym przykładzie w necie takiego grzebania nie widziałem ...
0

A jak zmienisz predkosc na 9600 z 4800?

Problem ze dziala w programie wzorcowym a nie dziala u ciebie moze wynikac z tego ze korzystasz z portu virtualnego.

Dawno dawno temu jak podlaczalem SDI pod przejsciowke USB-COM to takie glupoty jak predkosc mialy ogromne znaczenie, raz dzialalo, raz nie

0

W oprogramowaniu dostarczonym przez producenta można zmieniać baudrate w zakresie 1200-57600. Zawsze działa.
U mnie nie działa, niezależnie od tego jakiego baudrate użyję.

Możesz rozwinąć wątek portu wirtualnego ?

0

Pogooglałem trochę. Ten port wirtualny to chyba strzał w dziesiątkę. W necie jest wiele podobnych problemów - port wirtualny, java comm api, port otwiera się bez problemu, ale o czytaniu/zapisie nie ma mowy.

Gdyby ktoś znał sposób na ten problem, będę wdzięczny za pomoc, póki co spróbuję dalej poszukać ...

Jakby co - używam implementacji RXTX.

0

Jeśli ktoś by kiedyś miał podobny problem, trzeba rozwiązać go w sposób następujący :

  1. olać RXTX
  2. wyszukać na necie sunowską implementację Java Comm Api dla Windows (uwaga - oficjalnie nie jest wspierana, z java.sun.com jej nie zdobędziemy, trzeba szukać na irańskich stronach ;))
  3. użyć tego samego kodu, tylko z jednym importem innym.

I wtedy śmiga. Nawet na wirtualnym porcie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1