Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Czy ktoś zbudował aplikację w Java do odb. danych z RS232?

fliper_katrill 22 Dec 2009 21:09 5172 26
  • #1
    fliper_katrill
    Level 20  
    Witam serdecznie!
    Szukam materiałów lub co lepsze przykładów aplikacji które np. zczytują dane z rs232 lub którymi można wysyłać dane po rs232 do urządzenia, kody i wszystko dotyczące tematu oczywiście w Javie, mogą być projekty w Netbeans lub Eclipse z gotowymi GUI. Podkreślam że nie mają one służyć działaniom typu kopiuj wklej! Muszę zdać taki projekt nikt nie pytał mnie o znajomość Javy. Potrafię zrobić interfejs gorzej z komunikacją.Masa jest tego w internecie lecz jakoś temat jest wyrywkowo potraktowany bez całościowych projektów od A do Z i zawsze mi czegoś brakuje (najczęściej klas). Proszę o pomoc :)
  • #3
    fliper_katrill
    Level 20  
    Byłem na tej stronie wiele razy.... szukanie igły w stogu siana (lub mój angielski wysiada) , znam jeszcze inne projekty z Internetu, jednak prawie zawsze są komplikacje z ich uruchomieniem gdyż brakuje klas, może inne przykłady? Nie mniej dziekuję za odzew :)
  • #4
    one_eddie
    Level 25  
    Jakich klas brakuje? Możesz pokazać konkretne problemy?
  • #5
    fliper_katrill
    Level 20  
    RS232 in Java for Windows
    Czy ktoś zbudował aplikację w Java do odb. danych z RS232?
    Wyskakuje mi błąd nie znaleziono klasy (a nie ma o niej mowy w projekcie ze strony)
    Nie wiem zbytnio gdzie mam zaingerować w kod aby odczytywał mi on zadawaną wartość ze sterownika skomunikowanego z tym kodem przez RS232. Mój sterownik wysyła temperaturę i to sprawdziłem w terminalu i na pewno działa, jak zmusić ten kod do odbierania danych? Jak powiązać GUI które jestem w stanie zrobić?
  • #6
    one_eddie
    Level 25  
    Jedyne co mi w tej chwili przychodzi do głowy patrząc na tego screena jest to że chyba pierwszy raz uruchamiasz aplikację w JAVIE. Myle się?
  • #7
    fliper_katrill
    Level 20  
    Pierwszy raz taką...:) inne w stylu policz (w terminalu) lub w netbeansie robiłem GUI dla np. kalkulatora, reszta we Free Java... czy jesteś w stanie mi pomóc?
  • #8
    one_eddie
    Level 25  
    Załącz źródła aplikacji postaram się wyeliminować pokazany błąd.
  • Helpful post
    #9
    pallid
    Level 20  
    Aby moc sciagnac JavaComm API, musisz sie zarejestrowac na stronie Sun. Potrzebne pakiety mozna sciagnac z centrum pobierania (strona projektu: http://java.sun.com/products/javacomm/). Opis instalacji bibliotek w systemie jest latwo dostepny w internecie, w przypadku jakis klopotow. Aby API bylo widoczne przez IDE, musi zostac dodane do bibliotek projektu ("Add JAR/Folder..." w zakladce "Libraries" we wlasciwosciach projektu w NetBeans).

    Opcjonalnie, mozesz sie zainteresowac pakietem RXTX (http://users.frii.com/jarvi/rxtx/), ktory ma identyczne interfejsy jak JavaComm, a przy tym lepsze wsparcie dla systemow operacyjnych.

    HTH. Pozdr.
  • #10
    piotrkopec
    Level 17  
    A gdzie masz klasę RS232Example z tutoriala? :)
    RXTX to dobry wybór.
    Wesołych Świąt!
  • #11
    fliper_katrill
    Level 20  
    Dodałem klasę RS232Example, dorzuciłem bibliotekę RTXTcomm (wcześniej ją miałem widocznie teraz przeoczyłem) i tu poproszę o radę co dalej? W załączeniu screen, co wybrać?
    Czy ktoś zbudował aplikację w Java do odb. danych z RS232?

    Dodano po 1 [minuty]:

    lub też inaczej.....jak sprawdzić że to działa ? ;p :D

    Dodano po 5 [minuty]:

    postanowiłem dorzucić projekt, jeśli ktoś ma ochotę to proszę korzystać
  • #12
    pallid
    Level 20  
    fliper_katrill wrote:
    lub też inaczej.....jak sprawdzić że to działa ? ;p :D


    To, co zalaczyles do ostatniego posta, dziala poprawnie (zakladajac, ze usunie sie bledy zaleznosci bibliotek i ze RXTX jest zainstalowany zgodnie z instrukcja). Jak chcesz przetestowac program, zainstaluj sobie wirtualny sterownik portu szeregowego (np. Virtual Serial Port Driver 6.9), stworz nowa pare wirtualnych portow i uruchom dla nich 2 instancje aplikacji:
    java -jar JavaSerial.jar COMx

    gdzie x to nr portu.
    Pozdr.

    PS:
    popraw program tak, zeby w przypadku braku parametrow wyswietlal sposob uzycia a nie wyjatek ArrayIndexOutOfBoundException.
  • #13
    fliper_katrill
    Level 20  
    Zanim wprowadzę zmiany chciałbym po 1 podziękować za podpowiedź i po 2 zapytać czy jest możliwość przetestowania programu w rzeczywistości bo ja już mam urządzenie które nadaje temperaturę z uC i ono działa pod hyperterminalem. Chciałem sprawdzić kod z Javy testując go z odbieranym na COMie sygnałem o temperaturze bez instalacji wirtualnych urządzeń :) a powiązania klas niestety są lipne ale za grosz klasy pozostałe (nie RS232Example) nie chciały odnaleźć bibliotek RXTXcomm, dokładnie nie chciały importować bo niby nie miały skąd gui.*

    Dodano po 58 [sekundy]:

    sorki oczywiscie nie gui tylko gnu.io
  • #14
    pallid
    Level 20  
    Aby dogadac sie ze Swoim uC potrzebujesz zmienic parametry transmisji:
    // setup connection parameters
    serialPort.setSerialPortParams(38400, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);


    na odpowiadajace tym, ktore sa ustawione w urzadzeniu, nastepnie (przypuszczalnie) wyslac odpowiednia ramke z zapytaniem.

    Jesli chodzi o biblioteki, to dobrze jest stworzyc sobie nowy folder w katalogu projektu, o nazwie lib, wrzucac do niego wszystkie zewnetrzne pakiety i tylko wskazac we wlasciwosciach projektu, ze zawartosc tego katalogu ma byc uwzgledniana podczas poszukiwania klas/interfejsow. Co wiecej, taki katalog jest automatycznie kopiowany przez IDE do katalogu wynikowego, wiec nie ma potem problemu z uruchomieniem kodu wynikowego.

    Pozdr.
  • #15
    fliper_katrill
    Level 20  
    Obie konfiguracje portu COM są takie same, jak mam zaobserwować a właściwie gdzie że wysyłana jest informacja ze sterownika korzystając z kodu Javy?
    nie mam narazie żadnego interfejsu i dopiero chcę go napisać, może kolega przytoczy jakiś przykład z wysyłaniem zapytania na COM?

    Dodano po 3 [minuty]:

    Czy ktoś zbudował aplikację w Java do odb. danych z RS232?

    o czym świadczy ta informacja?

    Dodano po 2 [godziny] 26 [minuty]:

    która ze zmiennych jest odpowiedzialna za daną otrzymaną a która za wysłaną?
  • Helpful post
    #16
    pallid
    Level 20  
    Nie zupelnie rozumiem. W zasadzie wszystko, czego potrzebujesz jest w zrodlach projektu, ktory podrzuciles. Mozna go przerobic tak, zeby bardziej przypominal okienkowy terminal, np.:

    public static void main(String[] args) throws Exception {
    
        if(args.length <= 0) {
            //printUsage();
            System.exit(1);
        }
        // connects to the port which name (e.g. COM1) is in the first argument
        new RS232Example().connect(args[0]);
        String msg = System.console().readLine();
        // send message through serial port using protocol implementation
        while(!msg.equalsIgnoreCase("exit")) {
            CommPortSender.send(msg.getBytes());
            msg = System.console().readLine();
        }
    }


    Blad widoczny na zrzucie ekranu to wyjatek, o ktorym pisalem wczesniej. Jesli podczas uruchamiania programu z konsoli (patrz wczesniejszy post) nie podasz nazwy portu (np. COM1, COM5), program sie wysypie wlasnie w taki sposob.
    Jesli chcesz uruchomic program z poziomu IDE (NetBeans), wejdz w ustawienia projektu i w zakladce Run w polu Arguments wpisz nazwe interesujacego cie portu.
    Pozdr.
  • #17
    fliper_katrill
    Level 20  
    Witam po przerwie świątecznej!
    Dziękuję kolego pallid za rzeczową dyskusję :) uruchomiłem projekt z argumentem COM6 bo taki mam COM w menedżerze (tu muszę dodać że jest to przejściówka USB/COM) i wywala mi błąd jak na screenie... proszę kolejny raz o pomoc :)
    Czy ktoś zbudował aplikację w Java do odb. danych z RS232?
  • #19
    fliper_katrill
    Level 20  
    Dzięki za radę one_eddie pomogło kopiowanie bibliotek! co do terminalowego wyglądu okna mam pytanie do kolegi pallid: wklejenie kodu spowodowało błąd jak na screenie, proszę czy mógłbyś się odnieść do tego?
    Czy ktoś zbudował aplikację w Java do odb. danych z RS232?
  • #20
    pallid
    Level 20  
    Linia 37 wyrzuca NPE (NullPointerException). Chodzi o kawalek:

    String msg = System.console().readLine();


    Wyjasnienie: http://netbeans.org/bugzilla/show_bug.cgi?id=68770

    Chodzi o to, ze System.console() zwraca null, gdy program wywolywany jest z Ant'a (automator), co w rezultacie powoduje wyjatek przy probie wywolania dowolnej metody (w tym przypadku: readLine()). Na chwile obecna bug ma status: RESOLVED WONTFIX, wiec niewiele da sie zrobic.

    Zwroc uwage, ze ten sam program (plik .jar znajduje sie w: [katalog_projektu]\dist), bedzie dzialal poprawnie, gdy zostanie uruchominy recznie.
  • #21
    fliper_katrill
    Level 20  
    Niestety, nie chce się uruchomić normalnie ze wskazanego przez Ciebie katalogu. Znalazłem prostszy jak dla mnie do przetłumaczenia sobie projekt na stronie
    Link. Jego uruchomienie nie wniosło żadnych strat ze strony moich szarych komórek i skompilował się ODRAZU! niestety tylko kilka razy potem zaczął świrować i znów mam błąd z NPE..... postaram jakoś sobie z tym pomóc a pytanie mam ważniejsze jak mam połączyć GUI z kodem dotyczącym czytania z RS'a?
    Czy ktoś zbudował aplikację w Java do odb. danych z RS232? Czy ktoś zbudował aplikację w Java do odb. danych z RS232?
    podejrzewam że w :
    // TODO add your handling code here:
    muszę dodać powiązanie z klasą nulltest i będzie to ta klasa: (czy źle to robię?)

    
     public void serialEvent(SerialPortEvent event) {
          switch (event.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:
             // we get here if data has been received
             byte[] readBuffer = new byte[20];
             try {
                // read data
                while (inputStream.available() > 0) {
                   int numBytes = inputStream.read(readBuffer);
                }
                // print data
                String result  = new String(readBuffer);
                System.out.println("Read: "+result);
             } catch (IOException e) {}
    
             break;
          }
       }
    
  • #23
    fliper_katrill
    Level 20  
    Temat mam zaliczony, kod napisany, zrobiłem to z pomocą gotowca z internetu. Dorzuciłem wykres temperatury. Jeśli ktoś jest zainteresowany czekam na odpowiedzi.
  • #24
    sq6ncc
    Level 11  
    fliper_katrill wrote:
    Witam serdecznie!
    Szukam materiałów lub co lepsze przykładów aplikacji które np. zczytują dane z rs232 lub którymi można wysyłać dane po rs232 do urządzenia, kody i wszystko dotyczące tematu oczywiście w Javie, mogą być projekty w Netbeans lub Eclipse z gotowymi GUI. Podkreślam że nie mają one służyć działaniom typu kopiuj wklej! Muszę zdać taki projekt nikt nie pytał mnie o znajomość Javy. Potrafię zrobić interfejs gorzej z komunikacją.Masa jest tego w internecie lecz jakoś temat jest wyrywkowo potraktowany bez całościowych projektów od A do Z i zawsze mi czegoś brakuje (najczęściej klas). Proszę o pomoc :)


    Witam,

    Kiedyś trafiłem na łatwy sposób obsługi RS232 zarówno pod Windowsem jak i pod Linuxem - GiovynetSerialPort - może komuś sie przyda:
    http://www.giovynet.com/

    Pozdrawiam
  • #26
    gaskoin
    Level 38  
    Dr.Vee wrote:
    http://java.sun.com/products/javacomm/

    Jakieś 6-7 lat temu nie dało się jeszcze tego używać (wiem z autopsji), ale może teraz już implementacje zostały poprawione.

    Pozdrawiam,
    Dr.Vee


    sun zrezygnował ze wspierania microsoftu, lecz faktycznie poprawił biblioteki :)
  • #27
    fliper_katrill
    Level 20  
    Załącznik z programem do pobrania można pobrać z linku 2 posty wyżej :)
    Temat zamykam, dziękuję.