2008-08-06 20 views
39

Potrzebuję wysyłać i odbierać dane przez łącza szeregowe (RS-232 i RS-422).Jak skonfigurować i komunikować się z portem szeregowym?

Jak skonfigurować i komunikować się z takim połączeniem? Jak ustalić, jakie powinny być ustawienia konfiguracji (np. Szybkość transmisji) i jak je ustawić?

W szczególności staram się to zrobić w Javie, C/C++ lub w jednej z większych powłok uniksowych, ale także interesuję się programowaniem szeregowym przy użyciu Windows/Hyperterminal.

Odpowiedz

27

Zbuduj maszynę czasu i wróć do 1987 roku? Ho ho.

Dobrze, nie więcej złośliwych komentarzy.

Jak mogę dowiedzieć się, jakie ustawienia konfiguracyjne (np szybkość transmisji) powinny być ...

Czytaj arkusz? Ok ok. Poważnie, ostatni. Jeśli nie znasz szybkości transmisji urządzenia, z którym próbujesz się komunikować, masz dwie możliwości. Rozpocznij zgadywanie lub ewentualnie wyrzuć o-zakres. Jeśli potrzebujesz dobrego punktu wyjścia, pozwól mi zaproponować 9600-8-N-1. Podejrzewam, że stosunkowo szybko można się tam dostać brutalną siłą. Istnieje trzecia opcja posiadania old-schoolowego ninja, który może po prostu odczytać za pomocą LOOK zniekształconych znaków przy pewnej standardowej prędkości transmisji jaka jest aktualna szybkość transmisji. Imponująca sztuczka ze strony, aby się upewnić.

Mam nadzieję, że masz dostęp do tych informacji. W systemie unix/linux możesz pobrać pakiet minicom, aby grać bezpośrednio z portem szeregowym. Powinno to dość szybko doprowadzić do ustalenia konfiguracji.

jeden z głównych muszli Unix

W Unix port szeregowy (y) jest/są odwzorowywane na plik/dev/podkatalog. ttyS0, na przykład. Jeśli ustawisz poprawną prędkość transmisji i co za tym idzie, używając minicoma, możesz nawet przesłać do niego pliki, aby wysłać tam pliki.

Do mięsa pytania można uzyskać dostęp do niego programowo poprzez nagłówki POSIX. termios.h jest wielki.

Patrz: http://www.easysw.com/~mike/serial/serial.html#3_1 (już niedostępny)

ale mam również pewne zainteresowanie programowania szeregowego za pomocą Windows/HyperTerminal.

Hyperterminal i minicom to w zasadzie ten sam program. Jeśli chodzi o to, jak system Windows pozwala uzyskać dostęp do portu szeregowego, zostawię to pytanie komuś innemu. Nie robiłem tego w Windows od czasów Win95.

2

Z drugiej strony, jeśli chcesz to zrobić za pomocą C#, który będzie działać zarówno w systemie Windows, jak i Linux - z pewną wersją limitations (EDYCJA: która może być nieaktualna.) Nie mam możliwości przetestowania.) . Po prostu stwórz obiekt SerialPort, ustaw jego szybkość transmisji, port i inne dziwne ustawienia, otwórz połączenie i wypisz swój bajt []. Po wszystkich ustawieniach obiekt SerialPort działa bardzo podobnie do dowolnego strumienia sieciowego, więc powinno to być łatwe do wykrycia.

I jak w stanie ibrandy, musisz znać wszystkie te ustawienia, takie jak szybkość transmisji, zanim zaczniesz próbować komunikować się z dowolnym urządzeniem szeregowym.

2

W pracy wykorzystujemy teraterm i realterm do sprawdzania, czy dane szeregowe są poprawnie sformatowane. Mamy również rozdzielacz sprzętowy z przełącznikiem, dzięki czemu możemy monitorować ruch do naszej aplikacji poprzez kabel z powrotem do innego portu.

System Windows umożliwia dostęp do portu szeregowego za pośrednictwem funkcji CreateFile. To daje ci uchwyt, a stamtąd możesz skonfigurować dostęp.

1

Od Java (już niedostępny) Biblioteka rxtx jest dość dobry. Podnosi się tam, gdzie zostało przerwane szeregowe środowisko IO firmy Sun.

+0

Powyższy link nie działa. Zobacz [Wiki RXTX] (http://rxtx.qbang.org/). – George

7

dla C/C++ w systemie Windows trzeba (co najmniej) dwie opcje:

  1. Użyj klasy SerialPort dostarczone przez .NET.
  2. Użyj interfejsu Win32 API. Istnieje extensive MSDN article sięga 1995 roku, a wiele bezpłatnych bibliotek i przykładów w Internecie, aby zacząć.

Opcja .NET będzie znacznie łatwiejsza.

9

Jeśli chcesz kodować w Javie, naprawdę polecam SerialIOs SerialPort. Jest bardzo łatwy w użyciu i oszczędza dni pracy. Nigdy nie znalazłem biblioteki open source tak dobrej jak SerialIO, NAPRAWDĘ!

Moja rada: nie używaj seryjnej struktury IO firmy Sun! To jest od 1998 roku i pełne błędów. Możesz użyć rxtx, ale serialio jest lepsze!

3

Jeśli to musi być krzyżówka, proponuję spojrzeć na Boost Asio.

2

Od jakiegoś czasu napisałem przyzwoitą aplikację do przesyłania połączeń z farmy modemów do adresu sieciowego TCP/IP.

Początkowo szukałem nieobciążonej (wolnej) biblioteki Serial IO. Próbowałem Sun, IBM i RxTx. Były one dobre do opracowania aplikacji i do wstępnego testowania, ale w produkcji okazały się niestabilne.

Wreszcie zapłaciłem za SerialIO's SerialPort. Konwersja była dosłownie ćwiczeniem w zmieniającym się przywozie, a biblioteka była absolutnie absolutnie solidna - nie mogę jej wystarczająco polecić. Moja aplikacja działa już 24 godziny na dobę, 7 dni w tygodniu, przez siedem dni w tygodniu, a żaden problem nie dotyczy wielu klientów.

Jeśli zaczniesz programowanie przy użyciu SerialPort, będą miały lepszy interfejs API i będę go używać.

Jeśli potrzebujesz obsługi wielu platform, Java z SerialPort był najlepszym wyborem, jaki mogłem znaleźć.

Na koniec, ich licencjonowanie jest bardzo rozsądne, o ile nie instalujesz oprogramowania na sprzęcie dla swoich klientów.

+0

Kiedy ostatnio używasz RxTx i SerialPort? Ciekawy jestem, czy RxTx się poprawił. – Gili

+0

@Gili: To było kilka lat temu, dla RxTx - nigdy nie wróciłem do niego po zakupie SerialPort, ponieważ nigdy nie mieliśmy problemów z SerialPort i nie ma żadnych opłat licencyjnych, więc nie ma motywacji do inwestowania czasu w RxTx. –

+0

@Gili: SerialPort jest obecnie wykorzystywany przez naszych klientów. –

0

W zależności od urządzenia Próbujesz się komunikować, może być więcej parametrów niż szybkość transmisji, liczba bitów danych, typ kontroli parzystości i liczba bitów stopu do rozważenia.Jeśli dobrze pamiętam, modemy używają dziewięciu linii interfejsu RS-232C. Niektóre urządzenia, na przykład kasy rejestrujące, mogą używać uzgadniania sprzętowego na liniach RTS/CTS lub liniach DTR/STR.

Ogólnie dobrze jest wiedzieć, jak działa interfejs. Nie można się komunikować, jeśli szybkość transmisji nie jest zgodna, ale niewłaściwe ustawienie innych parametrów może być rodzajem pracy. Na przykład Możesz łatwo wysyłać dane do urządzenia oczekując 1 bitu stopu z 2 ustawionymi bitami stopu. Problemy pojawiają się, gdy próbujesz otrzymać dane w takim przypadku. Można również wykorzystywać odpowiednio ustawiony bit parzystości jako jeden z bitów stopu itp

0

Używam purejavacomm: It is an implementation of javax.comm written in pure java + JNA

przeciwieństwie RxTx, nie trzeba instalować dll. Jest napisany w czystym Java + JNA, który rozwiązał dla mnie problem przenośności między Windows i Linux. Powinno być łatwe przeniesienie do innych systemów operacyjnych obsługiwanych przez JNA, takich jak Solaris i FreeBSD, ale ich nie wypróbowałem.

Można się spodziewać, że czysta biblioteka Java będzie opóźniona w stosunku do natywnej implementacji, takiej jak wydajność rxtx, ale przy nowoczesnych procesorach, wąskim gardłem będzie najprawdopodobniej bitrate portu szeregowego, a nie procesora. Ponadto debugowanie jest o wiele łatwiejsze niż mieszana biblioteka Java/Native lub czysty skompilowany kod natywny.

0

Jeśli nie są zmuszeni do korzystania z konkretnego kompilatora Proponuję używać Qt i w nowym 5.3 wersji znajdziesz klasę poświęconą portów szeregowych:

http://qt-project.org/doc/qt-5/qserialport.html

Kod zostanie piszesz będzie działa na wszystkich platformach Qt suppited, przynajmniej tych, które mają porty szeregowe.