Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

serijska komunikacija na jednom PC-u

[es] :: C/C++ programiranje :: serijska komunikacija na jednom PC-u

[ Pregleda: 2884 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

mrki
radnik
Sombor

Član broj: 1050
Poruke: 580
62.108.126.*

Jabber: mrki@elitesecurity.org
ICQ: 58816584


Profil

icon serijska komunikacija na jednom PC-u14.10.2002. u 00:31 - pre 238 meseci
Treba mi da pokrenem minterm.c (linux), jednostavan program za komunikaciju izmedju serijskih portova. Na raspolaganju imam samo jedan pc. Nesto sam procitao o tome da se mogu povezati dva serijska porta, na jednom pc-u. Dali je to moguce i kako? Ovo mi treba da bih dopunio neki svoj programcic, koji umesto da prima podatke sa tastature treba da ih recv() sa RS-232. Stvarno sam se zaglavio oko ovoga, i treba mi pomoc...help!


Nekad sam bio mlad ;)
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.telia.com

Sajt: dejan.lekic.org


+2 Profil

icon Re: serijska komunikacija na jednom PC-u14.10.2002. u 04:00 - pre 238 meseci
Nadam se da ce neko od cenjenih ETF studenata da baci pogled na ovaj tekst ovde. :)

Jel tebo to treba za Windows ili Linux?
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

silverglider

Član broj: 651
Poruke: 218
*.batalpha.de

Sajt: www.benchmark.co.yu


Profil

icon Re: serijska komunikacija na jednom PC-u14.10.2002. u 15:18 - pre 238 meseci
Tretiras serijski port kao file (uz vodjenje racuna ko ima prava nad ttySx device entry fajlovima - da ne ispadne da moze samo root) i onda vrsis iscitavanje iz tog streama.

Napravio sam komponentu za serijsku komunikaciju pod linuxom (doduse za Kylix) pa mogu da ti ili posaljem ili ovde pastujem par kljucnih stvari (otvaranje porta, terminal settings i slicno), pa posto se ionako koriste libc funkcije, trebalo bi da ispadne jasno.


 
Odgovor na temu

mrki
radnik
Sombor

Član broj: 1050
Poruke: 580
62.108.126.*

Jabber: mrki@elitesecurity.org
ICQ: 58816584


Profil

icon Re: serijska komunikacija na jednom PC-u15.10.2002. u 05:25 - pre 238 meseci
Citat:
leka:
Nadam se da ce neko od cenjenih ETF studenata da baci pogled na ovaj tekst ovde.

Jel tebo to treba za Windows ili Linux?


Sto? Zar sam nesto lupio?

Pa napiso sam -> Linux
Nekad sam bio mlad ;)
 
Odgovor na temu

mrki
radnik
Sombor

Član broj: 1050
Poruke: 580
62.108.126.*

Jabber: mrki@elitesecurity.org
ICQ: 58816584


Profil

icon Re: serijska komunikacija na jednom PC-u15.10.2002. u 05:47 - pre 238 meseci
Citat:
silverglider:

Napravio sam komponentu za serijsku komunikaciju pod linuxom (doduse za Kylix) pa mogu da ti ili posaljem ili ovde pastujem par kljucnih stvari (otvaranje porta, terminal settings i slicno)



Moze (oboje) ako ti nije problem
Nekad sam bio mlad ;)
 
Odgovor na temu

silverglider

Član broj: 651
Poruke: 218
*.batalpha.de

Sajt: www.benchmark.co.yu


Profil

icon Re: serijska komunikacija na jednom PC-u15.10.2002. u 13:57 - pre 238 meseci
Ne znam sad da li da ti odgovorim, posto nisam ETF-ovac .... :D

Ok, prvo par oficijelnih informacija:
- http://www.ibiblio.org/pub/Linux/docs/HOWTO/Serial-HOWTO
- http://www.ibiblio.org/pub/Lin...HOWTO/Serial-Programming-HOWTO
- redirektuj "man termios" u fajl pa odstampaj
- za testiranje mozda da stavis chmod 777 na /dev/ttyS0, recimo, ako ces njega da mucis :) Jeste da nije lepo, ali se lako vrati kasnije.


Na ovaj nacin inicijalizujes port i zatvaras ga (u zavisnosti da li si prosledio true ili false); da li ces to staviti u konstruktor ili u neku svoju OpenPort funkciju, tvoja stvar:

Code:

procedure TsSimpleSerial.SetOpen(Value:boolean);
var ios:  termios;
    portname : string;
    bits, speed  : cardinal;

begin
  if Value <> FOpen then
  begin
    // if open
    if Value then
    begin
      case ComPort of
        ttyS0: portname := '/dev/ttyS0';
        ttyS1: portname := '/dev/ttyS1';
        ttyS2: portname := '/dev/ttyS2';
        ttyS3: portname := '/dev/ttyS3';
      end;
      case Bitrate of
        br2400:   speed := B2400;
        br4800:   speed := B4800;
        br9600:   speed := B9600;
        br19200:  speed := B19200;
        br57600:  speed := B57600;
        br115200: speed := B115200;
      end;
      case DataBits of
        db5: bits := CS5;
        db6: bits := CS6;
        db7: bits := CS7;
        db8: bits := CS8;
      end;

      // open the port and get its terminal attributes
      ComHandle:= LibC.Open(pchar(portname),fmOpenReadWrite or o_nonblock);
      // if its really opened ...
      if ComHandle <> s_NONE then
      begin
        FOpen := true;

        tcgetattr(ComHandle,ios);
        cfmakeraw(ios);

        // reset the attributes
        case Parity of
          pNone : ios.c_cflag := ios.c_cflag and (not PARENB);
          pEven : begin
                    ios.c_cflag := ios.c_cflag or PARENB;
                    ios.c_cflag := ios.c_cflag and (not PARODD);
                  end;
          pOdd  : begin
                   ios.c_cflag := ios.c_cflag or PARENB;
                   ios.c_cflag := ios.c_cflag or PARODD;
                  end;
        end;

        if FlowControl <> fcNONE then
          ios.c_cflag := ios.c_cflag or CRTSCTS
        else
          ios.c_cflag := ios.c_cflag and (not CRTSCTS);

        if StopBits = sb1 then
          ios.c_cflag := ios.c_cflag and (not CSTOPB);
        ios.c_cflag := ios.c_cflag and (not CSIZE);
        ios.c_cflag := ios.c_cflag or bits;

        // set in/out speeds
        cfsetospeed (ios, speed);
        cfsetispeed (ios, speed);
        // and apply the changed attributes
        tcsetattr (ComHandle,tcsanow,ios);
      end
       else raise ESerialPortError.Create('Cannot open serial port '+portname);
    end
     else // if open = false
      if ComHandle <> s_NONE then
        fileClose(ComHandle);
  end;
end;


ComPort, BitRate, Parity, DataBits, FlowControl, StopBits su atributi moje klase, postavljanju se iz drugih metoda, a vrednosti koje se stavljaju u njih su klasicna enum polja. Ovde se samo proveravaju i ocigledno je da je rvalue vrednosti iz libc biblioteke.
s_NONE je moja konstanta i iznosi -1.
ESerialPort je moja exception klasa.
Sve ostalo bi trebalo da bude libc-ovo.
PChar je kylix funkcija koja pretvara pascal string u null-terminisani string.
Cardinal je u Kylixu unsigned 32-bit integer, dakle unsigned long.

Za terminal atribute pogledaj pomenuti "man termios". Moze klasa stvarno da se napravi kompletna, ali meni nije trebalo toliko komplikovanje.

Dalji upis i citanje radis sa klasicnim FileWrite i FileRead (sa klasicnim parametrima - adresa bafera i 'koliko bajtova'), dakle, nesto ovakvo:

Code:

//==============================================================================
function TsSimpleSerial.ReadTG(var Buffer; Count: integer): integer;
begin
  if (Open and (ComHandle <> s_NONE) ) then
    Result := FileRead(ComHandle, Buffer, Count)
  else
   Result := s_NONE;
end;
//==============================================================================
function TsSimpleSerial.WriteTG(const Buffer; Count: integer): integer;
begin
  if (Open and (ComHandle <> s_NONE) ) then
    Result := FileWrite(ComHandle, Buffer, Count) // -1 = error
  else Result := s_NONE;
end;





 
Odgovor na temu

silverglider

Član broj: 651
Poruke: 218
*.batalpha.de

Sajt: www.benchmark.co.yu


Profil

icon Re: serijska komunikacija na jednom PC-u15.10.2002. u 14:03 - pre 238 meseci
Jes' da je malo spam, ali sto <code> tagovi ne nazubljuju source ?
 
Odgovor na temu

mrki
radnik
Sombor

Član broj: 1050
Poruke: 580
62.108.126.*

Jabber: mrki@elitesecurity.org
ICQ: 58816584


Profil

icon Re: serijska komunikacija na jednom PC-u16.10.2002. u 15:14 - pre 238 meseci
Uf, ja se stvarno izvinjavam svima, narocito silverglider-u u brzini sam prevideo ono (Kylix). U svakom slucaju hvala na trudu.
Radim u C (pod linux-om)i mislim da ce miniterm.c (mogu da postujem kod ako nekom treba) zadovlojiti moje potrebe. Samo da predefinisem svoje pitanje, konkretno:

Dali mi je potrebna fizicka veza izmedju serijskih portova na mome pc-u, kao sto je to potrebno ako se programi pokrecu na dva razlicita pc-a (null modem veza) da bih mogao ostvariti serijsku komunikaciju tj. Procitao sam onaj HOWTO o serijskom prog. tamo pise:

"it is also possible to perform this testing with only one computer, if you
have two unused serial ports. You can then run two miniterms off two virtual
consoles. If you free a serial port by disconnecting the mouse, remember to
redirect /dev/mouse if it exists. "

Ja bih da da iskoristim /dev/ttyS0 i RS 232. E sad sta se podrazumeva pod ovim preusmeriti /dev/mouse i kako da sacuvam podrazumevanu vrednost za /dev/ttyS0 kako bi naravno opet mogao koristiti mis-a kad zavrsim sa eksperimentisanjem



Nekad sam bio mlad ;)
 
Odgovor na temu

silverglider

Član broj: 651
Poruke: 218
62.104.203.*

Sajt: www.benchmark.co.yu


Profil

icon Re: serijska komunikacija na jednom PC-u17.10.2002. u 00:30 - pre 238 meseci
Nema problema za kod - ja mislim da je vrlo citljiv, tako da nije neki problem 'prebaciti' ga u C. Sve ove funkcije (fileOpen, fileRead, etc) su ionako funkcije glibc biblioteke, te mozes da ih povuces iz bilo kog jezika.

Da, potrebna ti je fizicka veza u tvom slucaju, dakle null-modem kabl koji vodi iz com1 u com2 ili obratno. Jedan ti je ulaz, drugi izlaz.
Kada su pomenuli redirekciju /dev/mouse, mislili su na menjanje targeta ovog sim.linka. Kao sto si verovatno primetio, /dev/mouse nije device entry nego samo soft-link ka pravom deviceu - ako imas serijski mis na com1, on pokazuje na /dev/ttyS0, ako imas PS/2 onda pokazuje na /dev/psaux, a ako imas USB mis, onda je najverovatnije /dev/input/mice. Posto ti bar nekoliko programa trazi mis na /dev/mouse (npr X server :) ), vazno je da ga usmeris na port na kojem se mis stvarno nalazi.
Ako zelis posle ponovo da ubodes serijski mis, recimo na com1, onda 'postavljas' soft-link sa "ln -s /dev/ttyS0 /dev/mouse".

 
Odgovor na temu

[es] :: C/C++ programiranje :: serijska komunikacija na jednom PC-u

[ Pregleda: 2884 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.