Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[c++] [linux] Sterowanie portem szeregowym.

r06ert 10 Kwi 2010 21:45 2513 7
  • #1 10 Kwi 2010 21:45
    r06ert
    Poziom 25  

    Witam serdecznie! Chciałem się zapytać kolegów o jakieś tutorial odnośnie obsługi portu szeregowego pod Ubuntu. Chciałem napisać prostą aplikację której zadaniem będzie odbiór danych z portu szeregowego, prosta obróbka i prezentacja wyników. Dodam ze aplikacja ma posiadać GUI. Niestety przyzwyczajony do prostych rozwiązań znanych z Microsoft Visual Studio (kontrolka serialPort) w linuxie to zadanie trochę mnie przerosło. :)

    Walczyłem z biblioteką qextserial i środowiskiem Qt Cerator. pod Ubuntu. Próbowałem coś wywalczyć przeglądając gotowce i różne example, ale kompilator ciągle coś zgłaszał.

    Wszelkie sugestie mile widziane. ...a oto kod z którym walczę:
    dołączam pliki nagłówkowe:

    Code:

    #include <posix_qextserialport.h>
    #include <qextserialbase.h>

    a następnie w zdarzeniu kliknięcia buttona próbuje stworzyć obiekt (wiem, wiem, mało to eleganckie ale to tylko przejściowo ;) )
    Code:

    Posix_QextSerialPort *RS232 = new Posix_QextSerialPort("/dev/ttyUSB0");

    i kompilator wywala mi błąd:
    undefined reference to 'Posix_QextSerialPort::Posix_QextSerialPort(QString const&)'
    W przykładzie ponoć to działało.

    Wszelkie sugestie mile widziane. Z góry dzięki.

    0 7
  • #2 10 Kwi 2010 22:48
    VanThor
    Poziom 19  

    A nie jest to przypadkiem błąd linkowania biblioteki? Może robisz to źle lub nie robisz wcale...

    0
  • #3 11 Kwi 2010 09:08
    r06ert
    Poziom 25  

    Wszystkie pliki znajdują sie w katalogu głównym projektu i dołączone są do niego. Sam wskaźnik do obiektu Posix_QextSerialPort mogę utworzy. Nie mogę natomiast utworzyć nowego obiektu za pomocą polecenia new.

    0
  • #4 13 Kwi 2010 14:42
    pralat
    Poziom 12  

    Jednak wygląda to na braki w linkowaniu.
    Robisz #include <posix_qextserialport.h>, dlatego możesz zadeklarować wskaźnik.
    Sprawdz, czy w pliku .pro, do zmiennej LIBS jest dopisana biblioteka qextserialport, np.:
    LIBS += -lqextserialport

    Jeżeli nie masz, to dopisz i "qmake".
    Zakładając, że masz bibliotekę zainstalowaną w systemie.

    0
  • #5 15 Kwi 2010 14:46
    utak3r
    Poziom 25  

    Zależy, co tam chcesz na tym porcie obsługiwać? Swego czasu napisałem małą bibliotekę dla C++. Nie wszystkie funkcje jeszcze w niej działają (jak np. sprawdzanie linii CTS), ale do popularnych protokołów transmisji wystarcza. Używam z powodzeniem tej biblioteki do komunikacji z różnymi urządzeniami, typu minidrukarki, wyświetlacze, czytniki itp. Równie dobrze działa w systemach wbudowanych (po to zresztą ją napisałem).

    Używa się tego banalnie, zobaczysz w kodzie. Przykład:

    Code:

    Serial PortCOM = new Serial;
    int iCOM = 1;
    PortCOM->Open(iCom, 9600);
    PortCOM->SendData("fajne to! :-)", 13);
    PortCOM->Close();


    Powodzenia :)

    0
    Załączniki:
  • #6 15 Kwi 2010 18:44
    r06ert
    Poziom 25  

    Dzięki za odpowiedź.

    Kolego pralat, ale z togo co ja zdążyłem wywnioskować to tych bibliotek nie instaluje się w systemie.

    Kolego utak3r czy istnieje jakiś sposób aby Twoje rozwiązanie zaadaptować tak, żeby zdarzenie odbiór znaku lub linii (ciągu znaków) wywoływało funkcję?

    Dzięki za odpowiedź.

    0
  • #7 15 Kwi 2010 20:21
    utak3r
    Poziom 25  

    Można by... trzeba by utworzyć wątek roboczy, który by sprawdzał stan portu co określony czas. Można by wtedy założyć jakiś bufor, odczytywać to, co przychodzi, a user w wątku nadrzędnym mógłby już czytać z tego bufora.
    Tak czy inaczej, nie obędzie się bez utworzenia wątku. Tutaj polecam lekturę biblioteki pthread.

    0
  • #8 16 Kwi 2010 14:54
    pralat
    Poziom 12  

    Zatem, jeżeli nie masz jej w systemie, tylko w jakims konkretnym katalogu (zawierającym plik .so), trzeba dodać ścieżkę niego do QMAKE_LIBDIR w pliku .pro.
    Reasumując, aby dobrze się zlinkowało trzeba zrobić tak w pliku .pro:
    LIBS += -lqextserialport
    QMAKE_LIBDIR += <ścieżka do katalogu z libqextserialport.so>

    0