Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Sériový terminál v linuxu? [vyřešeno]  (Přečteno 3918 krát)

Dragonn

  • Návštěvník
  • Příspěvků: 86
Sériový terminál v linuxu? [vyřešeno]
« kdy: 07 Února 2010, 18:11:48 »
Ahoj všichni!

Už nějakou dobu googlím a nemůžu najít nic jednoduchého co by mi fungovalo. A v podstatě ani moc nevím, jak to správně vyzkoušet :-/. Potřeboval bych jednoduchý prográmek, který by jenom komunikoval na sériovém portu se zvolenou rychlostí. Ideální by pro mě bylo aby také dokázal pracovat s daty v Ascii nebo hexa formátu. Co jsem našel a vypadalo nejlíp bylo toho http://www.plunk.org/~grantham/cgi-bin/blog.cgi?id=00015 ale nepovedla se mí kompilace zdrojáku :-/. Neznáte něco?

Rád bych dodal něco málo ještě i k okolnostem, protože nevím přesně kde je chyba. Vývoj probíhá na serveru bez GUI, takže potřebuji pouze řešení v CLI. Ve stroji je přidaná karta (2xSerial, 1xParallel) kterou, pokud mě paměť nešálí, server poznal (v době kdy jsem jí instaloval jsem to nějak řešil, už nevím přesně jak - tuším že dmesg a lspci), ale zatím jsem neměl možnost ji vyzkoušet v praxi. Na druhé straně seriové linky sedí mnou programovaný Atmel s odladěným kódem (testováno ve winxp) - takže tady asi chyba nebude.
Princip komunikace spočívá pouze v poslání dvojice čísel (příkaz-odpověď), nic složitého ani žádný velký datový přenos.

Předem díky za pomoc
« Poslední změna: 08 Února 2010, 20:05:16 od Dragonn »
Pokud něco alespoň trochu funguje, je lepší se v tom nešťourat.
Ntb: MSI EX300X, Core 2 duo 2GHz, 4GB RAM, ATI HD3450 256MB, Ubuntu 9.10

jfoot

  • Aktivní člen
  • *
  • Příspěvků: 197
  • ..nemožné ihned, zázraky do tří dnů...
Re: Sériový terminál v linuxu?
« Odpověď #1 kdy: 07 Února 2010, 19:24:08 »
Zdravím kolegu,

kolegu proto, že právě také masíruju jeden ATMEL (ATmegu 32),  :D. Zkuste si nainstalovat gtkterm anebo minicom. Já osobně používám (kvůli flexibilitě)  na linuxu vlastní, v Javě napsaný, poměrně primitivní program užívající  knihovnu rxtx.

Po šesté atomové válce  povrch planety Rogoz nevypadal pěkně...

Dítě nevinné...Co ty můžeš vědět...o sadomasochistické derivaci oidipovského komplexu...(O.Neff, K. Saudek, Arnal & Dva dračí zuby)

Dragonn

  • Návštěvník
  • Příspěvků: 86
Re: Sériový terminál v linuxu?
« Odpověď #2 kdy: 08 Února 2010, 01:06:45 »
Díky za reakci! Hned v první řadě bych chtěl všechny kdo sem budou psát požádat...prosimvás nevykejte mi! Díky :-). A já budu velice rád, když budu moct vám všem tykat :-).

Gtkterm jsem ani nezkoušel instalovat, protože předpokládam, že se jedná o grafickou aplikaci a já jaksi grafáiku k dispozici nemám na serveru. Noťas naoplátku nemá sériovej port. Zkoušel jsem minicom, ale nějak jsem si s nim nepokecal. Programování jednoduchého prográmku jsem chtěl nechat až na později, pokud by se mi nepovedlo sehnat žádný terminál ... stejně k tomu dojdu, protože budu potřebovat udělat obslužný program, který bude sbírat data ze seriové linky a strkat je do MySQL :-).

I když jsem si s Javou a rxtx knihovnou už jednou povídal, teďko bych asi rád napsal program v c++ protože mám ten dojem, že by to bylo méně náročné na cpu a možná i stabilnější na dlouhodobý provoz (plánuji non-stop). Co si o tomhle myslíte vy?

EDIT: Ještě bych rád dodal, že si ani nejsem jistej, jaký ttySx mám použít. V systému jsou čísla 0~3 a vím určitě že ttyS0 to není (používám pro komunikaci s UPS)
« Poslední změna: 08 Února 2010, 01:15:55 od Dragonn »
Pokud něco alespoň trochu funguje, je lepší se v tom nešťourat.
Ntb: MSI EX300X, Core 2 duo 2GHz, 4GB RAM, ATI HD3450 256MB, Ubuntu 9.10

Dragonn

  • Návštěvník
  • Příspěvků: 86
Re: Sériový terminál v linuxu?
« Odpověď #3 kdy: 08 Února 2010, 18:57:59 »
Trošku jsem postoupil v mém hledání - zkoušel jsem minicom, ale pořád jsem se s ní nedostal k tomu, co jsem potřeboval. Jde mi ve finále o jednoduchoučkou komunikaci 4800baudů bez parity. Zjistil jsem, že v jednom terminálu můžu pustit cat /dev/ttyS1 a v druhém pomocí echo -e "\x40" > /dev/ttyS1 odeslat hexa hodnotu. To mi zatím vcelku stačí, akorát bych potřeboval vypisovat přijaté hodnoty také v hexa... nevíte někdo jak na to? Našel jsem, že bych měl výpis prohnat přes pipu do hexdump nebo xxd, ale to mi nefunguje :-(, u souborů ano, ale u seriového portu mi to nenapíše nic... nevadí na tom to, že je to data stream? Konkrétně jsem zkoušel cat /dev/ttyS1 | hexdump

EDIT - ještě jsem zapomněl dodat, že jediné, na co jsem přišel bylo ukládat čtená data do souboru a periodicky spouštět hexdump, ale tohle řešení se mi nelíbí, protože není real-time, proto hledám další
« Poslední změna: 08 Února 2010, 19:04:26 od Dragonn »
Pokud něco alespoň trochu funguje, je lepší se v tom nešťourat.
Ntb: MSI EX300X, Core 2 duo 2GHz, 4GB RAM, ATI HD3450 256MB, Ubuntu 9.10

jfoot

  • Aktivní člen
  • *
  • Příspěvků: 197
  • ..nemožné ihned, zázraky do tří dnů...
Re: Sériový terminál v linuxu?
« Odpověď #4 kdy: 08 Února 2010, 19:18:50 »
Zdravím Dragonna,
Zkoušel jsem minicom, ale nějak jsem si s nim nepokecal.

Zkus  tohle : spusť minicom s těmito přepínači : minicom -o -c on, případně sudo minicom -o -c on .Význam přepínačů nastuduješ, když zadáš man minicom . Nastav parametry komunikace : ve volbě Nastavení sériového portu zadej do Sériové zařízení   tento řetězec : /dev/ttyS0, pokud máš RS232 vyvedený na CAN9 a device ttyS0 neokupují nějaký jiný(é) program(y) na tvém PC. Pokud tvůj ntb nemá sériový port,vyvedený na CAN 9 , ale máš USB, tak použij  /dev/ttyUSB0. Zkontroluj si, jestli se tvoje USB  mapuje na device ttyUSB0, jestli to třeba není ttyUSB1 pomocí příkazu dmesg. Potom ještě nastav nějaké parametry sériového kanálu, třeba 9600 Bd, bez parity, 1 start bit , 1 stop bit , no handshake, co je důležié nastav v minicomu Hardwarová kontrola toku  Ne, Softwarová kontrola toku Ne. Do USB portu vlož převodník USB-RS232 a stranu RS 232 vytvoř loopback, slušně řečeno spoj Rx a Tx špičky. Jo, v minicomu ještě nastav local Echo on/off na on. Potom stiskni nějaké písmeno v terminálu minicomu a obdržíš jej 2 x :  to které jsi vyslal (ťukancem do keyboardu) a tu druhé, přijaté přes loopback. Tím máš ověřeno, že tvoje RSko fachčí "až na kost", tedy až ke konektoru... Btw, nastavení  local Echo zopákni aspoň 2 x... jinak neuvidíš echo na character, který si vyslal z klávesnice a budeš vidět jen ten přijatý, což vypadá, jako kdyby  sériový kanál nevysílal (on ti ale jen vypisuje přijaté znaky ne vyslané). Čili, když je sériový kanál zkratovaný loopbackem funguje stisk jediného písmena vyvolá zobrazení dvou stejných znaků, vyslaného a přijatého...

I když jsem si s Javou a rxtx knihovnou už jednou povídal, teďko bych asi rád napsal program v c++ protože mám ten dojem, že by to bylo méně náročné na cpu a možná i stabilnější na dlouhodobý provoz (plánuji non-stop). Co si o tomhle myslíte vy?

To je dobrý námět na poměrně bohatou a docela zajímavou diskusi. Tohle bych viděl jako téma na nějakém setkání Ubuntu
men než tady na fóru, aspoň pro mě :moc práce, málo času vypisovat se, mám  teď docela slušný  pracovní fofr ;).....  .
Tak dej vědět, jak postupuješ ohledně minicomu...
Po šesté atomové válce  povrch planety Rogoz nevypadal pěkně...

Dítě nevinné...Co ty můžeš vědět...o sadomasochistické derivaci oidipovského komplexu...(O.Neff, K. Saudek, Arnal & Dva dračí zuby)

Dragonn

  • Návštěvník
  • Příspěvků: 86
Re: Sériový terminál v linuxu?
« Odpověď #5 kdy: 08 Února 2010, 20:05:02 »
moc díky, už mam jasno v minicomu a zjistil jsem, že k uplně stejnému nastavení jsem došel i vlastními silami, akorát jsem nepochopil to local Echo... nějak jsem si to nedal dohromady :-) a pořád jsem si myslel, že to nefunguje. Jediný problém minicomu je ten, že po sériové lince přicházejí čísla 0~10 a ty se těžko zobrazují jako znaky a zatím marně jsem hledal výpis v ascii nebo hex

Za pomoci metody loopback+echo/cat/pokus/omyl jsem vykoumal, že mnou používaný port bude ttyS1. Atmel je nastavený na 4800Bd, 1 stop bit, 8bitů bez parity, bez kontroly toku dat. Teďko už mám snad vše vykoumané a odzkoušené a kromě drobné chyby v programu procesoru je vše připravené a můžu se vesele vrhnout na programování obslužného programu. Asi se na něj vrhnu v c++, ale ještě to není definitivní.

Protože účel vlánka byl již splněn, tak ho označím za vyřešené ačkoliv bych rád slyšel ještě nějaké názory na mé dilema - C++ vs Java. Pokud by měl někdo zájem a čas, tak se své snažení snažím postupně uveřejňovat zde http://wiki.dragonn.net/kutilstvi/mereni-odberu.

jfoote, moc Ti děkuji za pomoc :)
Pokud něco alespoň trochu funguje, je lepší se v tom nešťourat.
Ntb: MSI EX300X, Core 2 duo 2GHz, 4GB RAM, ATI HD3450 256MB, Ubuntu 9.10

 

Provoz zaštiťuje spolek OpenAlt.