|
|
Oldal: 1 / 1
|
[ 2 hozzászólás ] |
|
Szerző |
Üzenet |
adylaszlo
vas-tag
Csatlakozott: szomb. jún. 13, 2009 17:28 Hozzászólások: 2
|
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 |
|
|
adylaszlo
vas-tag
Csatlakozott: szomb. jún. 13, 2009 17:28 Hozzászólások: 2
|
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 |
|
|
|
Oldal: 1 / 1
|
[ 2 hozzászólás ] |
|
Ki van itt |
Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 13 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.
|
|
|