Portál AbcLinuxu, 13. května 2025 22:13

Dotaz: Nastavení linky TxD sériového portu na úroveň H

10.9.2007 20:14 Rada | skóre: 14
Nastavení linky TxD sériového portu na úroveň H
Přečteno: 495×
Odpovědět | Admin
Zdravím všechny, pokouším se vytvořit program, který nastaví linku TxD sériového portu na úroveň H. Zkoušel jsem následující postup, který fungoval na ostatní výstupní linky DTR a RTS:

int iFlags = TIOCM_ST; fd = open("/dev/ttyS0", O_RDWR | O_SYNC); ioctl(fd, TIOCMBIS, &iFlags); ...

Pro linku TxD to ovšem nefunguje. Linky DTR a RTS se chovaly tak, že tento kód je nastavil na úroveň H a linky v ní setrvaly, dokud nebyl program ukončen. Linka TxD se tak ovšem nechová. Poradili byste mi prosím, co dělám špatně, případně jak jinak donutit linku TxD přepnout do úrovně H a aby v této úrovni setrvala?

Řešení dotazu:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Josef Kufner avatar 10.9.2007 20:25 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Nastavení linky TxD sériového portu na úroveň H
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jedna chytrá knížka (Využití rozhraní PC, B. Kainka) říká, že se musí "nahodit break". Tedy na adresy BA + 3 zapsat 64. Jak to udělat pomocí ioctl jsem nehledal, ale jsem si jist, že to tam někde bude ;-)
Hello world ! Segmentation fault (core dumped)
13.9.2007 20:29 Rada | skóre: 14
Rozbalit Rozbalit vše Re: Nastavení linky TxD sériového portu na úroveň H
Děkuji za informace. Tak jsem si tu knížku opatřil a vámi popsanou sekci jsem si přečetl. Daný postup ale vyžaduje zápis dat do konkrétních paměťových míst, což je poněkud nad moje programátorské síly. Navíc to asi bude vyžadovat práva roota - přecejen, uživatel těžko může takhle sahat na hardware (tady si nejsem jistý) - toto by pro mě bylo dost nepříjemné omezení. Samozřejmě tuto možnost prozkoumám, ale upřednostnil bych cestu přes systémové knihovny - právě například pomocí ioctl. Neřešil jste někdo podobný problém?
Josef Kufner avatar 13.9.2007 20:42 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Nastavení linky TxD sériového portu na úroveň H
Koukni se do hlavičkových souborů jádra na věci okolo ioctl. Je tam toho kopec a moc dokumentované to není. Ta knížka byla psána pro DOS, kde žádné jiné API ani nebylo. Ale i tak je to celkem fajn věc, jen by to chtělo doplnit o ty věci okolo linuxího API.
Hello world ! Segmentation fault (core dumped)
Pavel Vymetálek avatar 14.9.2007 07:04 Pavel Vymetálek | skóre: 15 | Náchod
Rozbalit Rozbalit vše Re: Nastavení linky TxD sériového portu na úroveň H
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jak někdo přede mnou správně řekl, tomuto stavu se říká break. V c to lze udělat následovně:

res = tcsendbreak(fd,duration);

a nebo natrvalo

res = ioctl(fd,TIOCSBRK) // nahodi break

res = ioctl(fd,TIOCCBRK) // shodi break

15.9.2007 15:16 trekker.dk | skóre: 72
Rozbalit Rozbalit vše Re: Nastavení linky TxD sériového portu na úroveň H
Někdo před vámi to řekl špatně. Stav break vyhodí na TxD logickou 0, tedy stav L. V logické 1 je tento pin sériového portu v klidu.
Quando omni flunkus moritati
Řešení 1× (Rada (tazatel))
15.9.2007 10:01 Rada | skóre: 14
Rozbalit Rozbalit vše Re: Nastavení linky TxD sériového portu na úroveň H
Odpovědět | | Sbalit | Link | Blokovat | Admin
Díky za poskytnuté rady. Problém je vyřešen. Použil jsem následující postup:
ioctl(fd, TIOCSBRK); /* Nastavi TXD */
ioctl(fd, TIOCCBRK); /* Vynuluje TXD */

Funguje to přesně podle mých představ ;-)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

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