[RS-232] Jaki stan na linii RTS?

Cześć! Spotkałem się z dziwną rzeczą... Mam w domu dwa komputery. Podłączam moje urządzonko do COM'a pierwszego komputera i wszytstko jest ok. Transmisja działa. Podłączam do drugiego komputera (identyczna konfiguracja) i transmisja już nie działa.

Szukam więc błędu... Łączę dwa komputery przewodem (skrzyżowane TXD z RXD i CTS z RTS, a DTR i DSR zwarte we wtyczce przewodu) i trasmisja jest!

Co do licha?

Pomierzyłem więc poziomy napięć na pinach portów. W obu komputerach wszystko się zgadza, poza jedną rzeczą - w jednym (tym, na którym transmisja jest ok) na RTS jest -10V, a w drugim jest

+10V. Jak więc powinno być?

I to chyba tego wina, bo jak zwarłem CTS i RTS to transmisja ruszyła.

Jednak muszę zrobić coś, żeby wszystko działało bez dodatkowych zworek.

Może wiecie jak zmusic port, żeby pracował w takiej konfiguracji jak na pierwszym komputerze? Aha, pracuję pod linuksem.

Oto jak mam podłączone moje urządzenie: komp: urządzenie: TXD ----------- RXD RXD ----------- TXD RTS ----------- CTS CTS ----------- RTS DTR -+ | DSR -+ GND ----------- GND

Proszę o rady!

Pozdrawiam, voice

Reply to
voice
Loading thread data ...

Odpalam własny soft. Jeśli wyłączę kontrolę przepływu

options.c_cflag &= ~CRTSCTS;

to transmisja na tym drugim kompie działa (+10V na RTS). Jeśli natomiast kontrola przepływu jest włączona: options.c_cflag |= CRTSCTS;

to już mi na tym komputerze nie działa... Ale na tym pierwszym jest ok!

Oto jak konfiguruje port w programie:

#v+ // open port fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);

tcflush(fd, TCIOFLUSH);

// set blocking mode fcntl(fd, F_SETFL, 0);

// get current options and store them in old_options tcgetattr(fd, &options); tcgetattr(fd, &old_options);

// set flow rates cfsetispeed(&options, B57600); cfsetospeed(&options, B57600);

// enable receiver and set local mode options.c_cflag |= (CLOCAL | CREAD);

// set no parity options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB;

// set character size options.c_cflag &= ~CSIZE; options.c_cflag |= CS8;

// hardware flow control options.c_cflag |= CRTSCTS;

// set raw input options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);

// set raw output options.c_oflag &= ~OPOST;

// set new options tcsetattr(fd, TCSANOW, &options); #v-

Zatem który UART jest ok? Ten z +10V czy -10V na RTS?

Pozdrawiam, voice

Reply to
voice

Oba :-)

Linia RTS, Request To Send, teoretycznie ustawia sie w stan aktywny [+10V, dokladniej +3 do +15V] gdy komputer [DTE] chce wyslac dane. Urzadzenie z drugiej strony [DCE] potwierdza gotowosc do przyjecia danych stanem aktywnym na linii CTS [wejsciowa w komputerze].

Komputer powinien byc tak oprogramowany, zeby nie wysylal danych o ile CTS nie jest w stanie aktywnym.

Ale teraz mamy pelna gale mozliwosci: a) twoje urzadzenie wymaga +10V na linii RTS, np do zasilania ... albo nie.

b) komputer nie aktywuje RTS bo zapomniales tego zrobic. c) komputer deaktywuje, bo nie ma nic do wyslania [cos pod modemy half duplex]

d) RTS nie ma znaczenia, urzadzonko nie wystawia CTS e) spalony pin CTS w komputerze i program nie widzi stanu aktywnego.

chociaz ruszenie po zwarciu CTS z RTS sugeruje port jest dobry, cos z urzadzeniem lub kablem. A moze wylacz kontrole przeplywu ?

J.

Reply to
J.F.

Zgadza się.

Tak, ale to jest zadanie sterownika portu szeregowego. Ja nie mam na to wpływu.

Nie, nie wymaga. "Urządzenie" to moduł bluetooth podczepiony do koputera przez MAX'a 3232. Moduł ma wyprowadzone TXD, RXD, CTS i RTS -- zakładam więc, że ma sprzętową kontrolę przepływu.

No właśnie to jest zadanie sterownika. Ja tylko piszę do pliku (portu) a sterownik powinien zająć się kontrolą przepływu. Spróbuję pisać do portu non stop i zobaczę na oscyloskopie czy cokolwiek dzieje się na RTS czy TXD.

No właśnie kiedy ją wyłączam options.c_cflag &= ~CRTSCTS; to wszystko gra...

Nie rozumiem tylko tego, dlaczego na dwóch komputerach w tej samej konfiguracji port działa inaczej :/

Pozdrawiam, voice

Reply to
voice

Zazwyczaj masz - ty ustawiasz jak sterownik ma dzialac.

Warte sprawdzenia.

Nadal nie wiesz czy problemem jest nieaktywny stan widziany na CTS i komp nic nie wysyla, czy moze urzadzenie nie wysyla.

Tak samo oprogramowane [dysk przekladasz ?] ?

Bo jeszcze sa mozliwe niekompatybilnosci napieciowe - np +2V na jednym komputerze to stan aktywny, na drugim nieaktywny.

J.

Reply to
J.F.

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.