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 + -
显示快捷键?