⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rs485-test.c

📁 ARM9200+嵌入式linux下串口通信程序
💻 C
字号:
/************************************************ *  serial communication demo *  by Zou jian guo <ah_zou@163.com>    *  2003-12-22 **************************************************/#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 1volatile int STOP=FALSE;volatile int fd,fd_pio;/*******************************************************************/void child_handler(int s){  printf("stop!!!\n");   STOP=TRUE;}/*******************************************************************/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 */     	write(1,&c,1); /* stdout */  	}  	printf("exit from reading modem\n");  	return NULL; }/*******************************************************************/void* send(void * data){  	int c='0';  	printf("send data\n");  	while (STOP==FALSE) /* modem input handler */  	{    	c++;    	c %= 255;    	write(fd,&c,1); /* stdout */    	usleep(1000000);  	}  	return NULL; /* wait for child to die or it will become a zombie */}/*******************************************************************/int main(int argc,char** argv){	struct termios oldtio,newtio,oldstdtio,newstdtio;	struct sigaction sa;	int ok; 	pthread_t th_a, th_b, th_c; 	void * retval;	if(argc <2){		printf("Usage: %s w|r \n",argv[0]);		return 0;	}   	fd = open(COM2, O_RDWR );	if (fd <0) {  		perror(COM4);    	exit(-1);  	}	fd_pio=open("/dev/pio/0",O_RDWR);	if(fd_pio < 0){		printf("####pio  device open fail####\n");		return (-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(SIGCHLD,&sa,NULL); /* handle dying child */	if(strcmp(argv[1],"w")==0){		ioctl(fd_pio, 1, 1);	  	pthread_create(&th_c, NULL, send, 0);	}	if(strcmp(argv[1],"r")==0){		ioctl(fd_pio, 0, 1);		pthread_create(&th_b, NULL, receive, 0);	}  	pthread_create(&th_a, NULL, keyboard, 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 + -