term.c

来自「一个串口应用程序」· C语言 代码 · 共 91 行

C
91
字号
#include <termios.h>/*终端控制定义*/#include <stdio.h>/*标准输入输出定义*/#include <unistd.h>/*Unix 标准函数定义*/#include <fcntl.h>/*文件控制定义*/#include <sys/signal.h>/*信号定义*/#include <pthread.h>/*线程定义*/#define BAUDRATE B115200  /*波特率预定义*/#define COM1 "/dev/ttyS0" /*预定义串口1*///#define ENDMINITERM 27 /* ESC to quit miniterm */#define ENDMINITERM 0x1B /* ESC to quit miniterm */#define FALSE 0#define TRUE 1volatile int STOP=FALSE;volatile int fd;/*当ESC键按下时将终止程序运行------*/void* keyboard(void * data){    int c;	for (;;){		c=getchar();		printf("aaa\n");      	if( c== ENDMINITERM){        	STOP=TRUE;        	break ;      	}	}    return NULL;}/*从串口接收数据线程-------------------*/void* receive(void * data){	int c;  	printf("read modem\n");  	while (STOP==FALSE)   	{    	read(fd,&c,1); /* 从串口读出数据 */    	write(1,&c,1); /* 在终端上输出数据 */  	}  	printf("exit from reading modem\n");  	return NULL; }/*向串口发送数据线程------------------------------------------------*/void* send(void * data){  	int c='0';  	printf("send data\n");  	while (STOP==FALSE)   	{    	c++;    	c %= 255;    	write(fd,&c,1); /* 向串口写入数据 */    	usleep(100000);//睡眠100毫秒  	}  	return NULL; /* wait for child to die or it will become a zombie */}/*主函数-------------------------------------------------*/int main(int argc,char** argv){	struct termios oldtio,newtio;	int ok; 	pthread_t th_a, th_b, th_c;/*th_a 终止程序运行;th_b接收数据;th_c发送数据*/ 	void * retval;  fd = open(COM1, O_RDWR ); //读写方式打开串口1;	if (fd <0)//失败处理	 {    	perror(COM1);    	exit(-1);  	}  tcgetattr(fd,&oldtio); /* 存储串口设置 */	newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;/*控制模式标志.设定bps的速度;硬体流量控制;8位,无校验位,1个终止位;本地连线,只能接收字元*/	newtio.c_iflag = IGNPAR; /*输入模式标志,IGNPAR忽略奇偶校验位 */	newtio.c_oflag = 0;		/*输出模式标志.0 Raw模式输出 */ 	newtio.c_lflag = 0;/*0非标准型输入,不回应*/ 	newtio.c_cc[VMIN]=1;/*在读取到1个字元前先停止*/	newtio.c_cc[VTIME]=0;/*不使用分割字元组的计时器*/  tcflush(fd, TCIFLUSH);/*清除串口缓冲区*/	tcsetattr(fd,TCSANOW,&newtio);/*设置串口新参数.TCSANOW常量指定所有的改变将立即生效,	  */  pthread_create(&th_a, NULL, keyboard, 0);/*创建线程*/  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); /* 恢复旧的设置 */   close(fd);  exit(0); }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?