serial programming using termios

Hi guys
I'm trying to connect to CISCO router using termios. So I decided to have two threads one for reading data and the other one for writing data.
And here's my code :

[code]int mainfd=0;
char ch[2] = {NULL};

void *write(void *)
char temp;
temp = getchar();
ch[0] = temp; ch[1] = '';
if(temp == '~')
printf("connection closed.
check=write(mainfd, ch, 1);

void *read(void *)
char outputbuffer[10000]= {0};
int charnumber=read(mainfd, &outputbuffer, sizeof(outputbuffer));
outputbuffer[charnumber] = '';
outputbuffer[0] = '';

int main(int argc,char *argv[])
struct termios old = {0};
if (tcgetattr(0, &old) < 0)
old.c_lflag &= ~ICANON;
old.c_lflag &= ~ECHO;
old.c_cc[VMIN] = 1;
old.c_cc[VTIME] = 0;
if (tcsetattr(0, TCSANOW, &old) < 0)
perror("tcsetattr ICANON");
struct termios options;
static int portnum=atoi(argv[1]);

mainfd = open_port(portnum);

fcntl(mainfd, F_SETFL, FNDELAY);
tcgetattr(mainfd, &options);
cfsetspeed(&options, speed);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB;
options.c_cflag |= CSTOPB;

options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~CRTSCTS;
options.c_iflag &= ~(ISTRIP|ICRNL);
options.c_oflag &= ~OPOST;
options.c_lflag &= ~(ICANON|ISIG|IEXTEN|ECHO);
options.c_cc[VMIN] = 1;
options.c_cc[VTIME] = 0;
tcsetattr(mainfd, TCSAFLUSH, &options);
pthread_t threads[2];
pthread_create(&threads[0], NULL, write, NULL);
pthread_create(&threads[1], NULL, read, NULL);

The problem is that I have to add sleep(2) (at least 2s) after writing user input to the port (line 17 I think) otherwise the output would not be what I expect. Without this sleep command, every character I type, the output is shown with next character not at time :

Router>abc // While I typed "abcd". If I continue with typing "e", then the output will be "abcd" and so on ...[/code]

How can I fix this ?
Sign In or Register to comment.

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!