Megválaszolatlan hozzászólások | Aktív témák Pontos idő: szomb. ápr. 27, 2024 18:56



Hozzászólás a témához  [ 2 hozzászólás ] 
Pseudo terminal Linux 
Szerző Üzenet
vas-tag

Csatlakozott: szomb. jún. 13, 2009 17:28
Hozzászólások: 2
Hozzászólás 
Meg oldodott.

/dev/ptmx volt a megoldás kulcsa.
Forras kod:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <stdlib.h>

int initport(int fd)
{
struct termios options;
tcgetattr(fd, &options);
cfsetispeed(&options, B38400);
cfsetospeed(&options, B38400);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
tcsetattr(fd, TCSANOW, &options);
return 1;
}

int getbaud(int fd)
{
struct termios termAttr;
int inputSpeed=-1;
speed_t baudRate;
tcgetattr(fd, &termAttr);
baudRate=cfgetispeed(&termAttr);
switch(baudRate)
{
case B0: inputSpeed=0;break;
case B50: inputSpeed=50;break;
case B110: inputSpeed=110;break;
case B134: inputSpeed=134;break;
case B150: inputSpeed=150;break;
case B200: inputSpeed=200;break;
case B300: inputSpeed=300;break;
case B600: inputSpeed=600;break;
case B1200: inputSpeed=1200;break;
case B1800: inputSpeed=1800;break;
case B2400: inputSpeed=2400;break;
case B4800: inputSpeed=4800;break;
case B9600: inputSpeed=9600;break;
case B19200: inputSpeed=19200;break;
case B38400: inputSpeed=38400;break;
}
return inputSpeed;
}

int writeport(int fd,char *chars)
{
int len=strlen(chars);
chars[len]=0x0d;
chars[len+1]=0x00;
int n=write(fd, chars, strlen(chars));
if(n<0)
{
fputs("Hiba az irás közben!\n", stderr);
return 0;
}
return 1;
}

int readport(int fd, char *result)
{
int iIn=read(fd, result, 254);
result[iIn-1]=0x00;
if(iIn<0)
{
if(errno==EAGAIN)
{
printf("SERIAL EAGAIN ERROR\n");
return 0;
}
else
{
printf("SERIAL read error %d %s\n",errno, strerror(errno));
return 0;
}
}
return 1;
}

int main(void)
{
int master,slave;
char *ptsn,olvas[254],olvas1[254],proba[]="Ok!",proba1[]="Ok!";
master = open( "/dev/ptmx", O_RDWR|O_NOCTTY );
grantpt( master );
unlockpt( master );
ptsn =(char*) ptsname( master );
slave = open( ptsn, O_RDWR|O_NOCTTY );
printf("master: %d\nptsname: %s\nslave: %d\n",master,ptsn,slave);
initport(master);
initport(slave);
printf("master baud=%d\n", getbaud(master));
printf("slave baud=%d\n", getbaud(slave));
if(!writeport(master,proba))
{
printf("irasi hiba\n");
close(master);
close(slave);
return 1;
}
printf("Ir master:%s\n",proba);
fcntl(slave, F_SETFL, FNDELAY);
if(!readport(slave,olvas))
{
printf("olvasasi hiba\n");
close(master);
close(slave);
return 1;
}
printf("Olvas slave:%s\n",olvas);
tcflush(master, TCIFLUSH);
tcflush(slave, TCIFLUSH);
tcflush(master, TCOFLUSH);
tcflush(slave, TCOFLUSH);
if(!writeport(slave,proba1))
{
printf("irasi hiba\n");
close(master);
close(slave);
return 1;
}
printf("Ir slave:%s\n",proba1);
fcntl(master, F_SETFL, FNDELAY);
if(!readport(master,olvas1))
{
printf("olvasasi hiba\n");
close(master);
close(slave);
return 1;
}
printf("Olvas master:%s\n",olvas1);
close(master);
close(slave);
return 0;
}


vas. jún. 14, 2009 17:00
Profil Privát üzenet küldése
vas-tag

Csatlakozott: szomb. jún. 13, 2009 17:28
Hozzászólások: 2
Hozzászólás Pseudo terminal Linux
Üdv Mindenkinek!

Soros portra szeretnék programot írni, de nincs módom rá kötni semmit se. Régebben olvastam a virtuális soros portokról. Át néztem pár írást róla. Írtam egy kis C programot ami az adatot küld virtuális portról a portra, vagyis én így értelmeztem az írásokat.

/dev/pts/0 ra ha írok akkor /dev/ttyS0 kéne tudnom olvasni és ha /dev/ttyS0 írok akkor /dev/pts/0 ról kéne tudnom olvasni.


#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
int fd1,fd2;

int main(int argc, char **argv)
{
fd1=open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
if(fd1==-1)
{
perror("nem sikerült megnyitni: /dev/ttyS0");
return 1;
}
else
{
fcntl(fd1, F_SETFL, 0);
}
fd2=open("/dev/pts/0", O_RDWR | O_NOCTTY | O_NDELAY);
if(fd2==-1)
{
perror("nem sikerult megnyitn: /dev/ptd/0");
return 1;
}
else
{
fcntl(fd2, F_SETFL, 0);
}
initport(fd1);
initport(fd2);
char sCmd[254]="Üzenet...";
if(!writeport(fd2, sCmd))
{
printf("írási hiba\n");
close(fd2);
return 1;
}
printf("kiírva:%s\n",sCmd);
usleep(500000);
char sResult[254];
fcntl(fd1, F_SETFL, FNDELAY);
if(!readport(fd1,sResult))
{
printf("olvasási hiba\n");
close(fd1);
return 1;
}
printf("olvasva=%s\n,sResult");
close(fd1);
return 0;
}

int initport(int fd)
{
struct termios options;
tcgetattr(fd, &options);
cfsetispeed(&options, B38400);
cfsetospeed(&options, B38400);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
tcsetattr(fd, TCSANOW, &options);
return 1;
}

int writeport(int fd,char *chars)
{
int len=strlen(chars);
chars[len]=0x0d;
chars[len+1]=0x00;
int n=write(fd, chars, strlen(chars));
if(n<0)
{
fputs("Hiba az irás közben!\n", stderr);
return 0;
}
return 1;
}

int readport(int fd, char *result)
{
int iIn=read(fd, result, 254);
result[iIn-1]=0x00;
if(iIn<0)
{
if(errno==EAGAIN)
{
printf("SERIAL EAGAIN ERROR\n");
return 0;
}
else
{
printf("SERIAL read error %d %s\n",errno, strerror(errno));
return 0;
}
}
return 1;
}

int getbaud(int fd)
{
struct termios termAttr;
int inputSpeed=-1;
speed_t baudRate;
tcgetattr(fd, &termAttr);
baudRate=cfgetispeed(&termAttr);
switch(baudRate)
{
case B0: inputSpeed=0;break;
case B50: inputSpeed=50;break;
case B110: inputSpeed=110;break;
case B134: inputSpeed=134;break;
case B150: inputSpeed=150;break;
case B200: inputSpeed=200;break;
case B300: inputSpeed=300;break;
case B600: inputSpeed=600;break;
case B1200: inputSpeed=1200;break;
case B1800: inputSpeed=1800;break;
case B2400: inputSpeed=2400;break;
case B4800: inputSpeed=4800;break;
case B9600: inputSpeed=9600;break;
case B19200: inputSpeed=19200;break;
case B38400: inputSpeed=38400;break;
}
return inputSpeed;
}

Mér az elvét nem jól értelmeztem?
Vagy a port beállításai nem jók?


szomb. jún. 13, 2009 17:30
Profil Privát üzenet küldése
Hozzászólások megjelenítése:  Rendezés  
Hozzászólás a témához   [ 2 hozzászólás ] 

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 6 vendég


Nem nyithatsz témákat ebben a fórumban.
Nem válaszolhatsz egy témára ebben a fórumban.
Nem szerkesztheted a hozzászólásaidat ebben a fórumban.
Nem törölheted a hozzászólásaidat ebben a fórumban.

Keresés:
Ugrás:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Magyar fordítás © Magyar phpBB Közösség