2011-10-18 15 views
5

Nie widziałem poprawnie skonfigurowanego portu szeregowego przy użyciu struktury termios, więc szukam bibliotek zewnętrznych.Czy możliwe jest parowanie mark i space za pomocą boost.asio?

Poradzono mi, aby spróbować boost.asio, ale patrząc na przykłady okazuje się, że nie obsługuje on parytetu znaku i przestrzeni, czy to prawda?

Jeśli to możliwe, ktoś może pokazać przykładowy kod, jak zrobić oznaczanie mark i space w boost.asio. Używam 8 databits, 115220 szybkość transmisji i 1 bit stopu.

Czy ktoś wie o bibliotekach stron trzecich, które obsługują parzystość znaku i miejsca na Linuksie, które mogę zamiast zwiększyć?

Odpowiedz

5

Istnieje bardzo dobry artykuł na temat tego problemu here.

W szczególności

MARK i przestrzeni parytetu, choć realizowane w większości sprzętu, nie są zdefiniowane w standardzie POSIX. Na przykład strona podręcznika biblioteki terminala Unix/Linux nie traci ani jednego słowa o tych dwóch trybach parzystości. (Zauważ, że PARMRK nie ma nic wspólnego ze znakiem parytetu.)

To dlatego, jak sądzę, te opcje nie są realizowane w Boost.Asio.

Istnieje wiele znanych rozwiązań: Na przykład

TRYBU 8M1 (8 bitów danych, znacznik parzystości 1 bit stopu) może być emulowane w 8n2. Zamiast wysyłać bit parzystości i bit stopu, wysyłane są dwa bity stopu . Ponieważ bity stopu są zawsze 1 (znaczniki bitowe), , oba tryby są równoważne.

Jeśli nie odpowiadają one Twoim wymaganiom, możesz uzyskać natywną reprezentację portu szeregowego w trybie przyspieszania asio. Od docs:

basic_serial_port::native_handle 

Get the native serial port representation. 

native_handle_type native_handle(); 
This function may be used to obtain the underlying representation of the serial port. This is intended to allow access to native serial port functionality that is not otherwise provided. 

aby zorientować użytkowania spojrzeć

boost_1_45_0/boost/asio/serial_port_base.hpp 

aw szczególności kodu do czynienia z parytetu w systemie Linux:

switch (value_) 
    { 
    case none: 
    storage.c_iflag |= IGNPAR; 
    storage.c_cflag &= ~(PARENB | PARODD); 
    break; 
    case even: 
    storage.c_iflag &= ~(IGNPAR | PARMRK); 
    storage.c_iflag |= INPCK; 
    storage.c_cflag |= PARENB; 
    storage.c_cflag &= ~PARODD; 
    break; 
    case odd: 
    storage.c_iflag &= ~(IGNPAR | PARMRK); 
    storage.c_iflag |= INPCK; 
    storage.c_cflag |= (PARENB | PARODD); 
    break; 
    default: 
    break; 
    } 

myślę chcesz użyć zestawu native_handle, aby ustawić flagę w następujący sposób:

cflag |= PARENB | CMSPAR // To select SPACE parity 
cflag &= ~PARODD 

cflag |= PARENB | CMSPAR | PARODD // to select MARK parity 

(według here, w każdym razie) zobaczyć również wrong sequence of libserial received data

+0

przykłady dajesz to struktura termios, że nie mogę dostać się do pracy i CMSPAR jest niezdefiniowane w moim systemie i nie działa. dzięki za odpowiedź i tak wiem, że muszę to zrobić w java :( – Skeith

+0

@Skeith - spójrz na link - możesz emulować zarówno Mark, jak i Space za pomocą dodatkowego bitu stopu (Mark jest łatwiejszy) - To jest bezpośrednio obsługiwane przez Boost.Asio bez konieczności grania z nieobsługiwanymi CMSPARami.BTW - Nie jestem pewien, czy zmiana języka pomoże, jeśli twoje jądro go nie obsługuje. – Tom

+0

Mamy program w języku Java, który komunikuje się z urządzeniem, ale został zbudowany przez mojego poprzednika. po prostu nie chciałem próbować odciąć kodu seryjnego od niego, jeśli to możliwe, ponieważ będzie to poważna praca, aby przepisać kod funkcjonalny z C++ na java, ponieważ brakuje nam tylko kodu seryjnego dla Linuksa, ale nie mam wyboru teraz. – Skeith

Powiązane problemy