📄 rs232-test.c
字号:
/************************************************ * serial communication demo * by Zou jian guo <ah_zou@163.com> * 2003-12-22 **************************************************/#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <stdlib.h>#include <termios.h>#include <stdio.h>#include <unistd.h>#include <fcntl.h>#include <sys/signal.h>#include <pthread.h>#define BAUDRATE B115200#define COM0 "/dev/ttyS0"#define COM1 "/dev/ttyS1"#define COM2 "/dev/ttyS2"#define COM3 "/dev/ttyS3"#define COM4 "/dev/ttyS4"#define ENDMINITERM 27 /* ESC to quit miniterm */#define FALSE 0#define TRUE 1static int STOP=FALSE;static int fd;void ctl_c_handler(int signo){ printf("quit !!!\n"); STOP=TRUE; exit(0);}/*--------------------------------------------------------*/void* keyboard(void * data){ int c; for (;;){ c=getchar(); if( c== ENDMINITERM){ STOP=TRUE; break ; } } return NULL;}/*--------------------------------------------------------*//* modem input handler */void* receive(void * data){ int c; printf("read modem\n"); while (STOP==FALSE) { read(fd,&c,1); /* com port */ //write(fd,&c,1); /* stdout */ putchar(c);/* stdout */ } printf("exit from reading modem\n"); return NULL; }int send_ascii(){ char c=0; int i; while (STOP==FALSE) /* modem input handler */ { c++; for(i=0;i<0x1000; i++); write(fd,&c,1); /* stdout */ } return 0; }/*--------------------------------------------------------*/void* send(void * data){ int c='0'; printf("send data\n"); send_ascii(); return ; while (STOP==FALSE) /* modem input handler */ { c=getchar(); write(fd,&c,1); /* stdout */ } return NULL; }/*--------------------------------------------------------*/int main(int argc,char** argv){ struct termios oldtio,newtio,oldstdtio,newstdtio; struct sigaction sa; int ok,num; pthread_t th_a, th_b, th_c; void * retval; char *COM[5]={ "/dev/ttyS0", "/dev/ttyS1", "/dev/ttyS2", "/dev/ttyS3", "/dev/ttyS4", }; // printf("argc=%d\n",argc); if(argc<2){ printf("Usage: %s [0-4] w|r \n",argv[0]); printf(" 0-4 is ttyS0-ttyS4 \n"); printf(" w : write to ttyS\n"); printf(" r : read from ttyS \n"); printf(" no 'w|r' is both read and write\n"); return 0; } num = atoi(argv[1]); printf("num=%d %s\n",num,COM[num]); if(num>4 || num<0){ printf("Port number must be 0 to 4! \n"); return -1; } fd = open(COM[num], O_RDWR ); if (fd <0) { perror(COM[num]); exit(-1); } tcgetattr(0,&oldstdtio); tcgetattr(fd,&oldtio); /* save current modem settings */ tcgetattr(fd,&newstdtio); /* get working stdtio */// newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;/*ctrol flag*/ newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;/*ctrol flag*/ newtio.c_iflag = IGNPAR; /*input flag*/ newtio.c_oflag = 0; /*output flag*/ newtio.c_lflag = 0; newtio.c_cc[VMIN]=1; newtio.c_cc[VTIME]=0; /* now clean the modem line and activate the settings for modem */ tcflush(fd, TCIFLUSH); tcsetattr(fd,TCSANOW,&newtio);/*set attrib */ // sa.sa_handler = child_handler;// sa.sa_flags = 0; sigaction(SIGINT,&ctl_c_handler,NULL); /* handle dying child */ pthread_create(&th_a, NULL, keyboard, 0); if(argc>2){ if(strcmp(argv[2],"r")==0){ pthread_create(&th_b, NULL, receive, 0); } if(strcmp(argv[2],"w")==0){ pthread_create(&th_c, NULL, send, 0); } } else{ pthread_create(&th_b, NULL, receive, 0); pthread_create(&th_c, NULL, send, 0); } pthread_join(th_a, &retval); pthread_join(th_b, &retval); pthread_join(th_c, &retval); tcsetattr(fd,TCSANOW,&oldtio); /* restore old modem setings */ tcsetattr(0,TCSANOW,&oldstdtio); /* restore old tty setings */ close(fd); exit(0); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -