#include #include #include #include #include #include #include void fd_setup(int , int , int ); int main() { int fd,pid; struct timeval sndtime, recvtime; fd = open("/dev/ttyS0" , O_RDWR ); if (fd == -1) perror("OPEN"); fd_setup(fd, 9600, 0); if( ( pid = vfork() ) == 0 ) { /* child waiting : to recv data from serial * port */ char buffer[ 100 + 1 ] = "\0"; int count = read( fd, buffer, sizeof( buffer ) ); printf("child created \n"); gettimeofday( &recvtime, NULL ); printf( "after read : secs\t: %u\tusecs\t: %u\n", recvtime.tv_sec, recvtime.tv_usec ); buffer[ count ] = '\0'; printf( "count = %d buffer %s ",count, buffer ); printf( "diff sec\t: %u\tusec\t: %u\n", recvtime.tv_sec - sndtime.tv_sec, recvtime.tv_usec - sndtime.tv_usec ); exit(0); } else { puts( "enter to start" ); getchar(); gettimeofday( &sndtime, NULL ); printf( "before write : secs\t: %u\tusecs\t: %u\n", sndtime.tv_sec, sndtime.tv_usec ); write( fd , "Ballu" , 5); gettimeofday( &sndtime, NULL ); printf( "after write : secs\t: %u\tusecs\t: %u\n", sndtime.tv_sec, sndtime.tv_usec ); } } void fd_setup(int fd, int speed, int flow) { struct termios t; if (fd < 0) { perror("fd_setup"); exit(1); } if (tcgetattr(fd, &t) < 0) { perror("tcgetattr"); exit(1); } cfmakeraw(&t); t.c_cflag &= ~CBAUD; t.c_cflag |= translate_speed(speed) | CS8 | CLOCAL; t.c_oflag = 0; /* turn off output processing */ t.c_lflag = 0; /* no local modes */ if (flow) t.c_cflag |= CRTSCTS; else t.c_cflag &= ~CRTSCTS; if (tcsetattr(fd, TCSANOW, &t) < 0) { perror("fd_setup : tcsetattr"); exit(1); } return; } int translate_speed(int spd) { int speed_c = 0; switch(spd) { case 9600: speed_c = B9600; break; case 19200: speed_c = B19200; break; case 38400: speed_c = B38400; break; case 57600: speed_c = B57600; break; case 115200: speed_c = B115200; break; case 230400: speed_c = B230400; break; case 460800: speed_c = B460800; break; default: printf("Bad baudrate %d.\n", spd); break; } return speed_c; }