Portál AbcLinuxu, 28. května 2024 16:20

Sériová komunikace pod Linuxem - II

23. 8. 2004 | Jan Martínek
Články - Sériová komunikace pod Linuxem - II  

Druhý díl návodu o tom, jak si podmaníte sériový port.

Prostřednictvím sériové linky je možné poslat a přijmout znak (bajt) a pro každý směr přenosu je určen jeden vodič. K obousměrné komunikaci tedy stačí tři dráty - vysílání (TxD), příjem (RxD) a uzemnění (GND). K reálné komunikaci to však úplně dostačovat nemusí, protože při odesílání není jistota, že je cílové zařízení na příjmu a vyslaný znak je schopno zpracovat. V této souvislosti vznikl mechanismus řízení toku dat, který popisuje, kdy je možné znak vyslat. Někdy se používá tzv. softwarové řízení (označované jako XON/XOFF), u kterého jsou určité znaky či sekvence rezervovány pro řízení toku dat. Z toho ovšem vyplývá, že pro binární přenos je tento způsob nepoužitelný, protože se zde může náhodně vyskytnout sekvence, která by byla nesprávně interpretována. Tuto limitaci lze sice obejít na aplikační úrovni, ale to už je složitější. Vznikl proto jiný způsob - hardwarový, označovaný jako RTSCTS nebo CTSRTS. Myšlenka spočívá v tom, že se k sériovému portu přidá další vodič, který bude mít logickou úroveň jedna, nebo nula podle toho, je-li cílové zařízení momentálně schopno přijmout znak. K přenosu této informace musí mít ono zařízení výstupní pin, který je označen jako RTS (Ready To Send). Tento pin musí být propojen s vysílací stranou, která je vybavena vstupním pinem CTS (Clear To Send). Vysílací strana tedy vysílá pouze tehdy, je-li CTS nastaveno na logickou 1.

Stavové linky

Piny RTS a CTS patří mezi tzv. stavové linky (modem status lines), což jsou vstupní nebo výstupní vývody, které lze použít pro různé účely. Podstatné však je uvědomit si, které jsou vstupní a které výstupní. Výstupní jsou pouze dvě, a to:

Zbývající jsou vstupní. Těmi jsou

Výstupní linky jsou po zapnutí počítače nastaveny na úroveň nula, což odpovídá napětí obvykle kolem -12V, ale u notebooků to může být v absolutní hodnotě poněkud nižší. Linky RTS a DTR (nebo jen jednu z nich) lze použít pro napájení nějakých zařízení připojených na sériový port, jako jsou myši, přijímače dálkového ovládání (viz http://lirc.org), jednočipové mikropočítače, teploměry a podobně. V elektronice však bývá zvykem, že napájecí napětí je kladné vůči zemi, a tak je pro aktivaci těchto zařízení potřeba poslat na RTS či DTR logickou 1, a tím se napětí změní na +12V. Při návrhu a konstrukci zařízení napájených ze sériového portu je třeba mít na paměti, že úroveň linek může být různá a zařízení se nesmí zničit při přepólování.

Zde je nakresleno typické schéma jak získat stabilizovaný zdroj 5V pro napájení elektronických zařízení.

Napájecí zdroj 5V ze sériového portu

Jak je uvedeno v dokumentaci, stabilizátor 78L05 vyžaduje na vstupu napětí 7 až 30 voltů. U notebooků však spodní napěťová hranice nemusí být zaručena.

Voltmetr ukazuje 6.69V, což je pod spodní hranicí pro obvod 7805

Voltmetr na fotografii ukazuje pouhých 6.69 V, a to naprázdno, kdy port není zatížený odběrem proudu. Podrobnější informace jak využít sériový port k napájení najdete v tomto článku.

Vstupní linky mají logickou úroveň nula, jestliže na ně není nic připojeno. Zkusme tedy propojit nějakou výstupní linku s nějakou vstupní. Opět může posloužit kousek alobalu. Celkem pohodlně to půjde u pinů 6 a 7, tedy DSR a RTS.

Konektor RS-232 s propojeným 6. a 7. pinem

Linka RTS je však na logické nule, a tudíž i DSR, takže se vůbec nic nestalo. Stav linek je možné číst příkazem

cat /proc/tty/driver/serial

což vypíše

serinfo:1.0 driver revision:
0: uart:16550A port:000003F8 irq:4 tx:34 rx:0
1: uart:16550A port:000002F8 irq:3 tx:3 rx:0
2: uart:unknown port:000003E8 irq:4
3: uart:unknown port:000002E8 irq:3
4: uart:unknown port:00000000 irq:0
5: uart:unknown port:00000000 irq:0
6: uart:unknown port:00000000 irq:0
7: uart:unknown port:00000000 irq:0

Nikde žádná zmínka o stavové lince, z toho vyplývá, že jsou všechny na nule. Chtělo by to změnit stav linky RTS na logickou jedničku. To je jednoduché, protože stačí sériový port otevřít pro čtení, zápis nebo oboje. Pustíme-li příkaz

cat /dev/ttyS0

Nastaví se RTS a DTR na jedničku. Nyní by měl příkaz cat /proc/tty/driver/serial vypsat, že linky RTS i DTR jsou na jedničce, ale zároveň i linka DSR je na logické 1, protože je propojena s RTS:

serinfo:1.0 driver revision:
0: uart:16550A port:000003F8 irq:4 tx:3027 rx:3014 RTS|DTR|DSR
1: uart:16550A port:000002F8 irq:3 tx:3 rx:0
2: uart:unknown port:000003E8 irq:4
3: uart:unknown port:000002E8 irq:3
4: uart:unknown port:00000000 irq:0
5: uart:unknown port:00000000 irq:0
6: uart:unknown port:00000000 irq:0
7: uart:unknown port:00000000 irq:0

Odstraníme-li alobalovou propojku, zmizí i příznak DSR.

Za zmínku stojí i program statserial, který se každou sekundu "dívá" na stav linek a přehledně je zobrazuje:

Device: /dev/ttyS0

Signal  Pin  Pin  Direction  Status  Full
Name    (25) (9)  (computer)         Name
-----   ---  ---  ---------  ------  -----
FG       1    -      -           -   Frame Ground
TxD      2    3      out         -   Transmit Data
RxD      3    2      in          -   Receive  Data
RTS      4    7      out         1   Request To Send
CTS      5    8      in          0   Clear To Send
DSR      6    6      in          1   Data Set Ready
GND      7    5      -           -   Signal Ground
DCD      8    1      in          0   Data Carrier Detect
DTR     20    4      out         1   Data Terminal Ready
RI      22    9      in          0   Ring Indicator

Všimněte si, že RTS a DTR jsou zapnuté. Je to pochopitelné, protože i program statserial musí zařízení otevřít, a tím tyto linky aktivuje.

Multiportové řadiče

V případě nedostatku sériových portů lze použít některý z multiportových řadičů a získat tím další dva nebo i více portů. Pod linuxem bez problémů fungují karty založené na čipu Netmos 9835, například řadič Kouwell 222N-2.

Řadič Kouwell 222N-2

Jeho cena se v současné době pohybuje kolem 450 Kč. Obsahuje dva sériové porty a jeden paralelní. V linuxu jsou tyto další porty přístupné přes /dev/ttyS4 a /dev/ttyS5.

Přídavná karta však může mít také ochranný význam. Dojde-li nějakou nešťastnou náhodou k tomu, že se do portu dostane výrazně vyšší napětí, než na jaké je stavěný, shoří při troše štěstí pouze přídavná karta a základní deska může být ušetřena. Následující fotografie dokládá, co se stane, když se připojí do sériového portu fáze, tj. napětí 220V proti zemi.

Spálený integrovaný obvod na řadiči

V tomto případě zůstala základní deska i nadále funkční. Řadič na sériové porty je však pochopitelně zničen. Zdůrazňuji, že přídavné sériové porty nejsou v žádném případě ochranným prvkem v pravém slova smyslu, neobsahují ochranu proti přepětí ani galvanické oddělení.

Na závěr bych rád podotkl, že sériový port i přes své stáří a jednoduchost umožňuje řadu kouzel, které by bez něj byly velmi komplikované. A proto doufejme, že jej USB vytlačí co možná nejpozději.

Související články

Sériová komunikace pod Linuxem - I
Jednočipy pod Linuxem - I
Jednočipy pod Linuxem - II

Odkazy a zdroje

Serial-HOWTO
Serial Programming Guide for POSIX Operating Systems
statserial(1)
/proc/tty/driver/serial
Get power out of PC RS-232 port
Schéma napájecího zdroje z RS232 ve formátu SVG

Další články z této rubriky

HW novinky: podzimní přehled #2
HW novinky: podzimní přehled #1
HW novinky: návrat skleněných ploten v HDD
HW novinky: PCI Express 4.0 prý ještě letos
HW novinky: i Skylake-X s 12 jádry používá levnou teplovodivou pastu

Diskuse k tomuto článku

23.8.2004 10:15 Petr Tomasek
Rozbalit Rozbalit vše RING
Odpovědět | Sbalit | Link | Blokovat | Admin
Dobry den!

Nevite nekdo, jak ma vypadat singal na RI? Rad bych si postavil prijmac dalkoveho ovladani (s nejakym jednocipem), ktery by umel vzbudit pocitac. WOR ("wake on ring") mi jinak funguje (zkousel jsem s modemem, stacilo zazvonit a pocitac se probudil). Diky!

P.S. Velmi dobry clanek, vic takovych!
23.8.2004 11:05 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: RING
Napěťové úrovně jsou pro všechny vstupní piny stejné. Hranice pro vyhodnocení logické "1" je, myslím, 3V. O to se ale nemusíte starat, když použijete obvod MAX232, který napěťové úrovně přizpůsobuje. O připojení jednočipu k sériovému portu se můžete dočíst v seriálu o jednočipech a také v diskusi, kde padlo mnoho zajímavých poznatků.
23.8.2004 13:39 BrandIt
Rozbalit Rozbalit vše naopak
Odpovědět | Sbalit | Link | Blokovat | Admin
RS232C definuje úroveň signálu log. 0 jako +3V až +25V a log. 1 jako -3V až -25V, tedy opačně než je uvedeno v článku (viz např. http://www.lookrs232.com/rs232/hardware.htm ).
23.8.2004 15:17 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: naopak
Nemohu si pomoci, ale voltmetr jasně říká, že když do pinu pošlu napětí vyšší než 3V, dojde ke změně ze stavu nenastaveno (např. CTS, RI, DSR, CD) na stav nastaveno. Podobně to platí u výstupních pinů - jestliže není nastaven RTS ani DTR, naměříme na pinech záporné napětí.
23.8.2004 16:34 Zdeněk Burda | skóre: 61 | blog: Zdendův blog | Praha
Rozbalit Rozbalit vše Re: naopak
uz asi 10 let ziju v domeni, ze u RS232 je log 0 kladne napeti a log 1 zaporne napeti. vtloukali mi to ve skole a par kousku HW jsem s tim uz vyrobil...
-- Nezdar není hanbou, hanbou je strach z pokusu.
23.8.2004 16:43 j
Rozbalit Rozbalit vše Re: naopak
To je pravda, ale tyto řídicí signály jsou aktivní v log. 0. Skutečně log. 0 odpovídá kladné napěti a log. 1 záporné napětí.
26.8.2004 21:00 bucki
Rozbalit Rozbalit vše Re: naopak
napatia, urovne, signaly ------------------------

logika RTS,CTS,DTR,DSR je obratena, teda log. 0 je kladne napatie a log. 1 je zaporne ale tieto signaly su NEGOVANE!!! teda /RTS /CTS.... atd

teda programom zapisete na RTS log 1, z UART obvodu vyjde do /RTS log. 0 a ta po prevedeni do urovni seriovej linky je kladnym napatim... pre log. 0 je to naopak - a zahadu mate vyriesenu!
26.8.2004 21:21 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: naopak
A pro větší pohodlí obvod MAX232 invertuje ;-)
Takže například programem pošleme do RTS log 1, z obvodu vyjde negovaná RTS jako 0, což dle normy představuje kladné napětí. Obvod MAX232 to invertuje a převede na úroveň TTL jako 0 voltů. Jednočip to vyhodnotí jako logickou 0.
Zestručním to: pošleme jedničku, dostaneme nulu.
23.8.2004 14:22 fikus
Rozbalit Rozbalit vše usb
Odpovědět | Sbalit | Link | Blokovat | Admin
dotaz na autora: a nechcete udelat stejne zajimavy clanek i o usb?
23.8.2004 16:48 Mti,
Rozbalit Rozbalit vše Re: usb
O usb nic nevim, ale jako inspirace by to mohlo pomoct:

Koupil sem si USB kabl k siemensu c55 ...

usb konec - drat - pixla - drat - konektor do telefonu.

V systemu mam ttyUSB0 (modul pl2303 - naslo si samo) , a konektor do telefonu je seriovka (stejna jak z toho max232), jenom je tam i napajeni :-) (z hlediska telefonu - nabijeni)

Uz mam dva a jeden strihnu - k jednocipu.

Smutny poznatek mam akorat se startem systemu - poukd startuje cups (nebo neco tesne kolem) , nesmi to byt pripojene ... :-( (fc1)

Jinak je ten brouk hezky ... umi oficialne aj neco pres pul megabitu...

Podobnych jednoucelovych prevodniku existuje vic, ale mi se na tom libi to, ze uz je to udelane.
23.8.2004 23:16 Mti.
Rozbalit Rozbalit vše Re: usb
Odpovim si sam :-)

... ve FC2 uz ten kabl pripojeny byt muze i pri startu a nic se nekousne :-)

Pripadne na www.hw.cz kdysi vysel clanek (reklama?) na cipy od ftdi ... taky prevod usb>serial. (taktez mely chodit pod linuxem bez problemu / nezkousel sem)
25.8.2004 17:44 Zdeněk Burda | skóre: 61 | blog: Zdendův blog | Praha
Rozbalit Rozbalit vše Re: usb
ftdi mam a pouzivam, ten svab funguje moc dobre
-- Nezdar není hanbou, hanbou je strach z pokusu.
28.8.2004 00:29 Radek Klof
Rozbalit Rozbalit vše Re: usb
Hmm, ze me FTDI zpusobuje absolutni vytuhnuti linuxu a pocitac pak reaguje jen na tlacitko reset.Zatimco ve windoze je vse ok.
25.8.2004 11:52 Tomáš | skóre: 31 | blog: Tomik
Rozbalit Rozbalit vše Re: usb
Mimo tema:

Muzete mi popsat, k cemu vsemu se da datavy kabel k Siemensu vyuzit? Mam stejy telefon a nevim, jestli si ten kabel poridit. Kterym programem se to ovlada? Muzete i emailem: tom tečka penicka zavináč centrum tečka cz.
25.8.2004 23:39 Mti.
Rozbalit Rozbalit vše Re: usb
no ... ja osobne na to pouzivam windowsovsky sx35 pod wine ... chodi dobre (posilani sms, tel. seznam). -poslat z cmd sms pres gnokii jsem zkousel, slo to. -SieFS chodi. - umi pripojit C55 jako disk (cca 300kB na obrazky/melodie...)

vse testovano na FC1.
23.8.2004 16:51 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: usb
Problematiku USB rád přenechám někomu kompetentnějšímu ;-)
24.8.2004 09:06 psl
Rozbalit Rozbalit vše Napajeni periferii ze serioveho portu?
Odpovědět | Sbalit | Link | Blokovat | Admin
V clanku byla zminena moznost napajet periferie ze serioveho portu, nastavenim urovni signalu DTR a RTS. Mam pro jeden mobil prevodnik na RS232 a ten mi pod Linuxem nefunguje, protoze potrebuje nastavit spravne DTR a RTS, ktere pouziva napajeni. Linux ovsem standartne nic takoveho nepodporuje, anebo ano? Treba pppd...

Takze pokud si nenapisi vlastni software, ktery bude linky implicitne ovladat tak mam smulu. Vyresil jsem to nakonec "hw" patchem, pripojil jsem prevodniku externi napajeni. Jeste si myslim, ze by sel napsat "wrapper", ktery by linky podle parametru nastavil a pak zavolal aplikaci ktera nastavovani linek ignoruje, pro me nejdulezitejsi pppd a treba i minicom. Ale k napsani wrapperu nemam dost know-how. A prekvapilo me, ze jsem nic podobneho nikde nenasel, jako by podobny probem nikoho netrapil
24.8.2004 09:38 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Napajeni periferii ze serioveho portu?
Prosím, uveďte na pravou míru, co přesně máte na mysli výrokem "Linux ovsem standartne nic takoveho nepodporuje ...". V článku se můžete dočíst, že linky RTS a DTR se nastaví "standartně" při otevření portu. Postará se o to samotné jádro == Linux. Napadá mě několik dotazů či připomínek:

- jste si jist, že linky mají být nastaveny? Třeba ten převodník používá obrácené napájení a je potřeba linky naopak vypnout. Ten váš "hw" patch používá kladné nebo záporné napětí vůči zemi?

- napsat onen program, který nastaví linky dle vašich potřeb, bude dost jednoduché. O pár příspěvků výše jsem uvedl, jak ovládat linku RTS. Totéž platí i o lince DTR. Poblém ale může nastat v zámcích ...

- Klíčové bude, jaký program pro komunikaci s mobilem používáte. Uveďte jeho název. Jistě nebude složité dopsat změnu linek přímo do něj.

- Nezkoušíte převodník na nějakém laptopu?

- Připojte mobil k počítači, začněte s ním komunikovat a v průběhu přenosu se podívejte na
/proc/tty/driver/serial
a zjistěte, jaký je stav linek.
30.8.2004 09:38 psl
Rozbalit Rozbalit vše Re: Napajeni periferii ze serioveho portu?
Omlouvam, mozna ze jsem to spatne napsal. Mozna ze je treba nejakou linku vypnout. Slovickareni nemam rad.

Jaky program? Vzdyt jsem zminil, pppd, minicom. pppd (kppp, atd), umi mnoho kouzel. Ale treba v mem pripade jsem narazil na to, ze linky DTR a DSR se pouzivali k napajeni prevodniku, jedna se musela zapnout, druha vypnout, tim se vytvorilo na vystupu portu kladne i zaporne napeti, ze? Takze pppd lze nakonfigurovat aby DTR a RTS nepouzival, ale uz nelze nastavit, jak se tyto linky maji nastavit, pravdepodobne se pouzije defaultni nastaveni, obe linky zapnute. A defaultni nastaveni nelze zmenit ani pomoci setserial utility.

Podobne minicom.

Pokud si napisete jednoduchy programek ktery linky nastavi, tak zjistite, ze po skonceni programku se linky uvedou do defaultniho stavu (close portu udela "reset").

Ted uz nezjistim ktera linka se mela zapnout, ktera vypnout, presel jsem na jiny mobil a pouzivam k pripojeni Bluetooth. Jen jsem chtel naznacit, ze v tomto pripade vyvojarum Linuxu neco uteklo, hw problemy je moc nezajimaji.

Tady se o problemu chvili psalo, reseni se nenalezlo: http://www.abclinuxu.cz/forum/show/27261

BTW, napadlo Vas nekdy proc pro Linux praticky neexistuje zadny sw pro odblokovavni/upgrady/modifikace, atd mobilnich telefonu? Proti Windows ma pro toto nasazeni mnoho prednosti, presto se nepouziva. Mozna ze toto je jeden z duvodu...
26.8.2004 01:27 bero
Rozbalit Rozbalit vše comtest
Odpovědět | Sbalit | Link | Blokovat | Admin
Kdysi davno jsem si ukradl DOSovy program comtest.exe. Je to puvodne utilita k jakesi velke ustredne, nicmene pro testovani a monitorovani stavu serioveho portu jsem nic lepsiho nevidel. Program je velmi jednoduchy. Umoznuje online ridit a sledovat stav vsech pinu RS232, nastavovat kontroler, overit ruzne parity, zapis a cteni dat, a prepnout zobrazeni (ASCII, HEX). Existuje neco takoveho pro Linux?
26.8.2004 08:32 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: comtest
Žádný takový program, neznám (čímž nechci říct, že neexistuje). V souladu s *nixovou filozofií je však k dispozici řada jednoduchých jednoúčelových nástrojů, se kterými lze dosáhnout víceméně stejných výsledků: Zmínil jste:
- řízení všech pinů RS232(asi máte na mysli pouze výstupní piny RTS a DTR). Na to bohužel žádný program neznám
- sledování všech pinů RS232 - statserial
- nastavovat kontroler - nevím, co máte na mysli, ale ekvivalent je asi setserial
- ověřit různé parity - stty, cat /proc/tty/driver/serial
- přepnout zobrazení ASCII - cat /dev/ttyS0
- přepnout zobrazení HEX - cat /dev/ttyS0 | xxd

Dále existuje minicom, který toho umí taky hodně.
Tím nechci říct, že není co zlepšovat, možná by se k tomu všemu tu a tam hodilo mít klikací frontend.
26.8.2004 14:11 bero
Rozbalit Rozbalit vše Re: comtest
Diky za odpoved, ale minicom je uplne nepouzitelny pro ladeni HW. Ja bych chtel skutecne realtime debuger seriove linky, uz jsem premyslel ze comtest prepisu do Linuxu tak jak je. Udelal jsem printscreen, takovy program mi v Linuxu dost chybi: http://jung.dyndns.org/4m4/comtest.jpg
12.9.2007 22:48 Michal
Rozbalit Rozbalit vše Re: comtest
> - řízení všech pinů RS232(asi máte na mysli pouze výstupní piny RTS a DTR). Na to bohužel žádný program neznám

k tomu jsem nasel program pport, umi pracovat i s paralelnim portem, tak snad pofrci

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.