RS232 - COM Port kezelés

Fórumok

Linux-os drv-t keresek RS232 - COM port lekezelésére.

Linux (debian) alá szeretném áthozni a win alatt fejlesztett RS232 - COM portot kezelő,
mérés-adatgyűjtő alkalmazásomat. Pascal és C környezetű források futnak.

Hogyan megy ez a COM port kezelés Linux, debian alatt ?

Tudtok ebben segíteni ?

köszi:virtualm@freemail.hu
LinuxLame : virtualm , (debil debianos)

Hozzászólások

Én így használom:

1. Megynitom a soros porthoz tartozó eszközt. (pl.: /dev/ttyS0)
2. poll - lal írom olvasom
3. lezárokm a soros porthoz tartozó eszközt.

Ha USB-d van, akkor egy USB-SER átalakítóval a /dev/USBn - re
is rányithatsz.

Ha kell tudok programpéldát adni...

(én is soroson keresztül mérés-adatgyűjtök)

> Sol omnibus lucet.

Sziasztok, gyorsak és rendesek vagytok.

Milyen fejlesztői környezetet ajánlotok, itt linux (debian) alatt ?

Fordító, linker, debugger ? ( hol lehet hozzájutni ?)

A példák engem is érdekelnek. Én egyenlőre csak win alatti példát tudok adni.

köszi:virtualm@freemail.hu

LinuxLame : virtualm , (debil debianos)

Itt Van példának okáért az open a soros_port beállításával.
Keressetek rá man-nal a függvényhívásokra. "C" nyelvi környezet.

//----------------------------------------------------------------------------------------------

speed_t BaudXSpeed(unsigned char *b_str)
{speed_t speed;

speed=
(!memcmp(b_str,"B2400",5))?B2400:
(!memcmp(b_str,"B4800",5))?B4800:
(!memcmp(b_str,"B9600",5))?B9600:
(!memcmp(b_str,"B19200",6))?B19200:
(!memcmp(b_str,"B38400",6))?B38400:
(!memcmp(b_str,"B57600",6))?B57600:
(!memcmp(b_str,"B115200",7))?B115200:B9600;

return(speed);
}

//----------------------------------------------------------------------------------------------

void SerialOpen (unsigned wich)
{SerTab[wich].fd=open(&SerTab[wich].dev[0],O_RDWR | O_NOCTTY | O_NONBLOCK | O_SYNC);
tcgetattr(SerTab[wich].fd,&SerTab[wich].old_t);
bzero(&SerTab[wich].new_t,sizeof(struct termios));

SerTab[wich].new_t.c_cflag = CS8 | CREAD | CLOCAL;SerTab[wich].new_t.c_iflag=IGNPAR;
SerTab[wich].new_t.c_oflag=OPOST;SerTab[wich].new_t.c_lflag = IEXTEN;
SerTab[wich].new_t.c_cc[VMIN]=0;SerTab[wich].new_t.c_cc[VTIME]=0;

cfsetospeed(&SerTab[wich].new_t,BaudXSpeed(&SerTab[wich].baud[0]));
cfsetispeed(&SerTab[wich].new_t,BaudXSpeed(&SerTab[wich].baud[0]));
tcsetattr(SerTab[wich].fd,TCSANOW,&SerTab[wich].new_t);
tcflush(SerTab[wich].fd,TCIOFLUSH);WaitmSec(10);tcflush(SerTab[wich].fd,TCIOFLUSH);
}

> Sol omnibus lucet.

Látom van érdeklődő. Ez jó! Ha összeszerveztek egy pizzázást
Pesten valahol, akkor tartok egy kis kiképzést soros port
programozásból. Egyszerűbb lenne, mint egyeként elmondani
mindenkinek. (-::

Üdv: med.

> Sol omnibus lucet.

Itt a poll routin:

//----------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------

int GetSerPoll(unsigned int wich,unsigned short len,unsigned int rl_long,unsigned char *tchar)
{int count;
struct pollfd serpoll;
int selres;
unsigned int tmp;

memset(&SerTab[wich].modDTA[0],0,4096);SerReadLive=rl_long;tmp=0;

sigbrk: serpoll.fd=SerTab[wich].fd;serpoll.events=POLLIN|POLLPRI|POLLERR|POLLHUP;serpoll.revents=0;
count=0;selres=poll(&serpoll,1,SerTab[wich].timeout);

switch(selres)
{case -1: if(errno==EINTR)
{if(!SerReadLive--){SerTab[wich].sockstate=serpoll.revents;siglongjmp(SERreset,129);}
goto sigbrk;}
break;

case 0: break;

default: if(!len)
{while(SerReadLive)
{tmp=read(SerTab[wich].fd,&SerTab[wich].modDTA[count],4095);count+=tmp;
if(tchar!=NULL){if(CharSearch(&SerTab[wich].modDTA[0],0,*tchar,count+1)!=0xffff)break;}
else{break;}
SerReadLive--;if(SerReadLive)usleep(10000);}}

else{while(len>0)
{tmp=read(SerTab[wich].fd,&SerTab[wich].modDTA[count],len);
if(!tmp)SerReadLive--;if(!SerReadLive)goto gsto;
usleep(10000);count+=tmp;len-=tmp;}}
break;
}

gsto: SerTab[wich].sockstate=serpoll.revents;
return(count);
}

//----------------------------------------------------------------------------------------------

> Sol omnibus lucet.

Egyébként én úgy szervezem a soros_porti kommunikációt, hogy,
mivel több programom futhat egyszerre, amelyek soros portot
használhatnak, van egy démon szerű valami, ami kiajánl egy
megosztott_mem területet. Ez az adatátviteli terület. Ide pakolom
az elküldendőket, illetve itt várom a beérkező adatokat.
Ha az adatátviteli terület elő van készítve, akkor egy
signal()-lal s.e.g.g.berúgom a démont, az megteszi amit kell,
és ha megjött a check_bit, akkor kiolvasom, ami az adatátviteli
területben van(fogadás) illetve tudomásul vettem a küldés
sikerességét(küldés).

Üdv: med.

> Sol omnibus lucet.