Soros port beállítása.

Fórumok

Sziasztok!

A feladat az lenne, hogy soros porton keresztül megjhajtsak egy 2*20-as pontmátrix LCD kijelzőt. Ehhez a soros portomat ami jelenleg ttyS1 (COM2) kelene a beállítanom, hogy az interfész fizikai rétegének paraméterei:
• 8 adatbit, 1 stopbit, nincs paritás
• baudrate = 2400 BPS.

Ez elméletileg meg is van, de valószínüleg mégsem.

stty -F /dev/ttyS1 -parenb cs8 ospeed 2400

beállítással próbálkoztam.

Valamint hogy a kiküldött karaktrek ASCII kódolással menjenek.

Tudna nekem valaki segíteni?

Hozzászólások

"Ez elméletileg meg is van, de valószínüleg mégsem." - ez mit jelent?

En a 'setserial' nevu programot hasznalom a soros port beallitasara...

"Valamint hogy a kiküldött karaktrek ASCII kódolással menjenek." -- hat kuld azzal... ;) Mit es hogyan akarsz kuldeni amugy...?

Zsiraf

Ez elméletileg meg is van, de valószínüleg mégsem.

Az a baj hogy a céleszköznek azzal a pár paraméterrel beállított soros porttal kell szöveget átadni.

Lehet, hogy velem van a baj, de ezekből nem értem, hogy mi a konkrét problémád! A fenti beállítással próbáltad, de nem működik vagy mi?

btw, próbáld meg így beállítani:

stty -F /dev/ttyS1 raw 2400

Szabi

Kicsit furcsa ez nekem ...
Minden soros port piszkáló programom avval kezdődik,. hogy elmentem a beállításokat átállítom a portot majd kiommunikálok. A program végeztével visszaállítom a portot és kilépek.
Nem igazán tudok olyan beállítókáról, ami csak beállítja majd otthagyja a portot. A Linux -on van olyan mint a ppp vagy a getty ami egy kijelölt portot használ, minden beállítást meg kell neki mondani - konfigurálni.
A setseril mint olyan a port elérhetőségét (hw cím, irq és néhány speciális beállítást nyújt). A port aktuális beállításai talán az ioctrl -en keresztül elérhetőek, esetleg a /sys fájl rendszeren keresztül elérhető.
Talán a getty beállítja és utána lehet küldeni a device -nak adatot, de ez akkor is valamilyen terminál protokoll. Ha simán csak tesztelni akarod, akkor a legkényelmesebbnek a minicom tűnik.

* Én egy indián vagyok. Minden indián hazudik.

"Nem igazán tudok olyan beállítókáról, ami csak beállítja majd otthagyja a portot. " -- hat akkor most parat megtudtal: setserial, inittab, ...

"A setseril mint olyan a port elérhetőségét (hw cím, irq és néhány speciális beállítást nyújt)." -- hmm.. he???
A 'setserial'-al a soros port tulajdonsagait tudod beallitani.

"A port aktuális beállításai talán az ioctrl -en keresztül elérhetőek, esetleg a /sys fájl rendszeren keresztül elérhető." A soros port tulajdonsagai sokfele modon elerhetoek pl. megtekintheto ill. beallithato a 'setserial' programmal.

"Talán a getty beállítja és utána lehet küldeni a device -nak adatot, de ez akkor is valamilyen terminál protokoll." -- he?

Zsiraf

Nem tudom te melyik inittab -ot nézed, én valami olyat látok benne hogy
...:/sbin/getty -L ttyS0 9600 vt100
az én olvasatomban ez azt jelenti, hogy az inittab elindítja a getty -t a ttyS0 (com1) device -on, 9600 Baudon vt100 -as terminálként. A device ezeket alapból nem, hanem az getty tudja, kezeli. Egyébként ez csak mint minta csücsül az inittab -ban ha amennyiben kellene egy soros konzol.

$setserial /dev/ttyS0 -a
/dev/ttyS0, line 0, UAT: 16550A, Port: 0x03f8, IRQ: 4
Baud_base: 115200, close_delay: 50, divisor: 0
closing_wait: 3000
Flags: spd_normal skip_test
Hol látsz te itt működési Baudrate -t, nem beszélve az adat és stop bitek számáról?
Te most akor Zsiráf vagy szaszg? -- he?

* Én egy indián vagyok. Minden indián hazudik.

setserial az kell, aztan johet a minicom.
Minicomban beallitod, amit akarsz, baudrate stb.
aztan elmented a beallitast.
Utanna asszem CTRL ALT Q: Leave without reset.

Köszönöm a segítséget.

De .. még mindig nem sikerült kivergődnöm a dologból.

A helyzet az hogy egy tipikus 2400 8N1 beállítás kellene a portra, amin adatot csak küldeni fogok egy ChipCad lcd 4.0 vezérlőre egy RS232MAX áramkörön keresztül.

Az stty-vel beállítom a portot, stty-vel kiolvasva minden ok, de valami nem jó, mert ha serialsetup-al kiolvasom, akkor ott már más jelenik meg.
A serialsetup nem enged 2400bps beállítást, 9600-ast igen.
Minicomal beállítom látszólag, de negyon nem jó.

Van még esetleg ötletetek?

Első kérdés, hogy milyen programmal akarsz kiküldeni akármit is?
Mert (mint előttem is mondták) annak a programnak illene beállítania.
Ha csak szkriptet használsz, akkor a setserial megfelelő lehet.
Én C-ben irt programjaimmal kezelem a soros portokat, abban a megfelelő ioctl hívással állítok be mindent.

Valaki említette előttem a soros port zárolását. Nem kötelező, de a /var/lock-ban szokás létrehozni egy file-t az eszköz nevén. Tartalma nem érdekes, csak a megléte, de általában a pid-et szokták beletenni, annak vizsgálatával könnyebb feloldani a beragadt lock-ot.

Zsolt

Nem a program küld, hanem script. Ezért kellene valahogy beállítani, hogy jól menjenek ki rajta a karakterek. Mert ha nincs megfelelően beállítva, akkor a kijelzőn nem karakterek jelennek meg, hanem teli négyzetek egyszerűen.

a setserialal nem boldogulok. Sajnos a baud_base 2400 értéket valamiért nem eszi meg.

root@kapu1:/home/kapu# setserial /dev/ttyS1 baud_base 2400
Cannot set serial info: Invalid argument

forditsd le (gcc -o ser ser.c) probald ki...


#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <strings.h>
        
#define BAUDRATE B2400
#define MODEMDEVICE "/dev/ttyS0"
#define _POSIX_SOURCE 1 /* POSIX compliant source */
#define FALSE 0
#define TRUE 1
        
volatile int STOP=FALSE; 
       
main()
{
        int fd,c, res;
        struct termios oldtio,newtio;
        
        fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY ); 
        if (fd <0) {perror(MODEMDEVICE); return(-1); }
        
        tcgetattr(fd,&oldtio); /* save current port settings */
        
        bzero(&newtio, sizeof(newtio));
        newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
        newtio.c_iflag = IGNPAR;
        newtio.c_oflag = 0;
        
        /* set input mode (non-canonical, no echo,...) */
        newtio.c_lflag = 0;
         
        newtio.c_cc[VTIME]    = 0;   /* inter-character timer unused */
        newtio.c_cc[VMIN]     = 5;   /* blocking read until 5 chars received */
        
        tcflush(fd, TCIFLUSH);
        tcsetattr(fd,TCSANOW,&newtio);
        printf("Megtortent\n");
//        tcsetattr(fd,TCSANOW,&oldtio);
      }

Zsiraf

Próbára mindenképp a minicomot javaslom, azon be tudsz állítani mindent, kézzel kiküldeni dolgokat, amennyiben nem igényel valami nem beírható bevezetést, vezérlést a kütyü.

Jól kapisgáltál az elején azzal a stty-al, csak még a handshake-ről is gondoskodni kéne. Ha nincs RTS/CTS handshaking, talán -raw lenne célravezető. A sebességet se csak a kimenőre addmeg, csak egyszerűen 2400, igy mindkét sebességet állítja.
lásd: man stty

Egyébként visszafele nem jön onnan semmi válasz vagy nyugta?

Nem tudom milyen eszközeid állnak rendelkezésre. Ha semmi nem megy, akkor én a portot szoktam ellenőrizni. Egy átlagos desktop gépben legalább két soros port van, az egyiken futtanám a minicom -ot (az elvárt beállításokkal) a másikon próbálkoznék küldözgetni, úgy hogs nullmodem kábellel összekötném őket. Ha így működik, akkor ugornék neki a "sötét ló" LCD -nek. Apropó, láttad azt a példányt működni, jó a kábeled ...
Még sorolhatnám az ilyen kis buktatókat, amellyekl napokat lehet el'ni.
Először győződj meg hogy valamelyik módszerrel sikerül beállítanod a használni kívánt portot.

* Én egy indián vagyok. Minden indián hazudik.

Ugye a soros port rendes, alaplapi UART, nem USB-s átalakító?!

Van egy eTC-2300-H kütyü, amiben elvileg nincs soros port. Nem szedtem még szét, de ez alapján bizakodhatok?
http://pastebin.com/mb0d0edf

Ez most egy Damn Small Linux alól való. Dmesg sajnos nem beszédes:
# dmesg | grep -i serial
<6>Serial driver version 5.05c (2001-07-08) with MANY_PORTS SHARE_IRQ SERIAL_PCI ISAPNP enabled

Korábban egy másik linux ennél a sornál azt irta ki, hogy 4 port...gondolom 4 port lehet az alaplapon. Kicsit sokallom, ám legyen.
A pastebinnen látszik, hogy S3-t kivéve S0-S4-ig egyformán reagál. Serial portot nem birizgáltam még így, mivel lehetne jobban megbizonyosdni róla -egyelőre- megbontás nélkül?

Úgy tűnik még sincs benne soros port, mert egy 1db soros porttal rendelkező gép dmesg-je a következőt írja:


Serial: 8250/16550 driver $Revision: 1.90 $ 4 ports, IRQ sharing enabled
serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A

eTC-2300 esetében az első sort láttam egy másik linux alatt (4 port) viszont a második sort már nem. Úgyhogy marad az USB-soros átalakító.

Hali!

Mivel letezik ez a topic, igy nem nyitottam problemamnak ujat.

A gondom az az, hogy szeretnek valamit vezerelni soros porton keresztul. Viszont barmivel probalkoztam, nem jott ossze. Gondoltam lemegyek a gyokerekhez, hatha valami SW problema van, nem is HW...

Nem vagyok tul jartas ebben a temakorben, de tobb helyen is lattam, hogy az alabbi tesztnek eredmennyel kellene szolgalnia:
Be SSH-zok az ominozus gepre, amin a serial portal rendelkezik, majd kiadom a " cat < /dev/tts/0 " parancsot, amivel elvileg a bejovo adatokat megkapom konzolon.
Nyitok a gepre egy uj konzolt, amin pedig kiadom az " echo 'test' > /dev/tts/0 " parancsot. Elvileg valaminek meg kellene jelennie az elso ablakon, de nem jelenik megsemmi...

A portok leteznek. A linux egyebkent OpenWRT.

Valakinek esetleg otlete, hogy hol lehet a hibat keresgelni?

Üdv!

Sajnos ezt így nem értem jól, le tudnád kicsit jobban írni a szitut?

Van egy PC-d, meg van egy eszközöd amin OpenWRT fut, és szeretnél soros kommunikációt megvalósítani közöttük?

Vagy pedig van egy eszközöd, amin OpenWRT fut, és azzal szeretnél valami 'kütyüt' piszkálni az OpenWRT-s eszköz sorosportján keresztül, és a PC-ről lépsz be SSH-val az OpenWRT-re?

Szoval, a szamitogep egy router, amin OpenWRT fut, van ket soros port kimenet tts0 es tts1. A tts0-ra van kotve a soros eszkoz, aminek szeretnek adatokat kuldeni. Kesobb fogadni is, de ez most meg nem erdekes...
Lenyeg, hogy az eszkoz nem reagal a kuldott adatokra. A HW reszt szamtalanszor leelenoriztem, annak rendben kell lennie.
Most szeretnem ellenorizni, hogy nem-e SW gond van. Igy hat be SSH-ztam ketszer a routerre, majd az egyik ablakban kuldtem adatot a portra, masikban olvastam azt. Viszont semmi jelet nem lattam az adatoknak.

Az alabbi tesztet vegeztem el, de nekem nem jelentek meg a karakterek a 2. ablakban:
http://www.lynxmotion.net/download/file.php?id=441&sid=d5f074fd45e9fb32…

Esetleg ha a ket soros portot kotom ossze igy:
TX -> RX
RX -> TX
GND -> GND

Ekkor elvileg a tts0 -n kimenu adatokat megkapom a tts1 -en?

Kezdem érteni :)
Azt javaslom, hogy keríts egy soros crosslink kábelt,és debugolásra ne magát a routert használd, hanem kösd össze a crosslink kábellel a géped soros portját a router valamelyik soros portjával, és próbáld meg, hogy küld-e valamit kifele a soros porton.
OpenWRT-re tudsz telepíteni minicom-ot, azzal egyszerűbb a port beállításokat, adat küldést-fogadást intézni. A telepítésről találsz HowTo-t a neten.

Igen, ha minden rendben van,akkor működhet a router két soros portjának az összekötése is aszerint ahogy leírtad, de egyszerűbb ha a PC-d soros portját használod, tekintve, hogy arról biztosan tudod, hogy működik, és biztosan tudod kezelni a sorosport-terminál programodból.

Ui. ha a routernek nem normál sorosport kimenete van (tehát nem DB9es csati), hanem TTL szintű soros UART portja(általában egy tüskesor), akkor szükséged lesz egy RS232/TTL szintillesztő áramköröcskére is.

Ui2: Linux alatti sorosport kezeléshez ez a default HowTo:
http://tldp.org/HOWTO/Serial-HOWTO-6.html#ss6.1

Én szintillesztő helyett telefon usb kábelt használtam.Pl. egy Nokia DKU-5 kábel alkalmas erre,az usb dugóban egy usb-serial átalakító van,ami TTL szintű jelekkel működik.A megfelelő ereket kikeresve és bekötve a routerbe szépen működik.Egy Asus WL500gP és egy Netgear WNDR3700 is megy vele.Ha jól emlékszem ark3116(linux kernelben támogatva,Win alatt XP only) chip van benne,de van még egy kábelem,az Prolific PL2303 chipes,és egy Samsung telefon kommunikációs kábele volt.Ehhez mindenféle driver fellelhető,linux,winxp,win7/vista,macosx.

Udv ujra!

Nos, nagyon jo eredmenyeket ertem el a soros portal, mondhatni majdnem tokeletes, es a baj az a majdnem!
Roviden es erthetoen:
Van egy tavolsagmero szenzorom, amelynek ha elkuldom a "VA" karakter parost a soros porton, akkor visszadob egy szamot, 1 es 256 kozott, attol fuggoen milyen messze eszlelt targyat (1-az orra elott van, 256-irto tavol van)
Szepen meg is jonnek a szamok, kiveve ha a szam 3 lenne, ilyet egyszeruen nem kapok.
Tehat ha odateszem kozvetlen ele a kezemet, akkor jon szepen az 1, ha tavolabb huzom akkor 2, majd jonne a 3, ami nem jon meg, de a 4 es azon tul mar minden.

Mindenfele program nelkul, nemes egyszeruseggel igy probalom ki:
echo "VA" > /dev/tts/1

Masik konzolon peddig:
cat < /dev/tts/1

Serial beallitas peddig:
stty -F /dev/tts/1 115200 cs8 -crtscts -parenb -clocal -icanon -inlcr

Az eszkozt masik PC-re dugva, az eszkoz Win32-es progijaval, mukodik, megkapom a 3-ast is.

Van elkepzelesetek mitol lehet, hogy pont ez az egy ertek nem jelenik meg?

OMG! Imadom, hogy itt ilyen okos emberek vannak!:) Koszi!
Valoban a 3-as vezerlo karakter volt es ez betett a dolognak.
Most kikapcsoltam minden ilyen featuret es szepen megjelenik a 3 is!:)
Mar napok ota ezzel szivok, fel tucat google altal talalt oldalt megneztem, de ilyesmire nem tertek ki...