1 启动线程1读串口
2 等待3秒后
3 启动线程2写串口,发送字符串后关闭
4 等待10秒
5 关闭两个线程
#include <pthread.h> #include <stdio.h> #include <sys/time.h> #include <string.h> #include<termios.h> #include<sys/stat.h> #include<fcntl.h> #define BAUDRATE B115200 #define MODEMDEVICE "/dev/ttyS0" #define R_BUF_LEN (256) void printtid(void); void* com_read(void* pstatu) { printtid(); int i=0; int fd,c=0,num; struct termios oldtio,newtio; char buf[R_BUF_LEN]; printf("start.../n"); /*打开PC机的COM1通信端口*/ fd=open(MODEMDEVICE,O_RDWR | O_NOCTTY | O_NONBLOCK/*| O_NDELAY*/); if(fd<0) { perror(MODEMDEVICE); exit(1); } printf("open .../n"); /*将目前终端机的结构保存至oldtio结构*/ tcgetattr(fd,&oldtio); /*清除newtio结构,重新设置通信协议*/ bzero(&newtio,sizeof(newtio)); /*通信协议设为8N1,8位数据位,N没有效验,1位结束位*/ newtio.c_cflag = BAUDRATE |CS8|CLOCAL|CREAD; newtio.c_iflag = IGNPAR; newtio.c_oflag = 0; /*设置为正规模式*/ newtio.c_lflag=ICANON; /*清除所有队列在串口的输入*/ tcflush(fd,TCIFLUSH); /*新的termios的结构作为通信端口的参数*/ tcsetattr(fd,TCSANOW,&newtio); printf("reading.../n"); while(*(int*)pstatu) { num = read(fd,buf, R_BUF_LEN); buf[R_BUF_LEN-1] = 0; if(num > 0 && num <= R_BUF_LEN) { buf[num]=0; printf("%s", buf); fflush(stdout); } } printf("close.../n"); close(fd); /*恢复旧的通信端口参数*/ tcsetattr(fd,TCSANOW,&oldtio); } void* com_send(void* p) { printtid(); int fd,c=0; struct termios oldtio,newtio; char ch; static char s1[20]; printf("Start.../n "); /*打开arm平台的COM1通信端口*/ fd=open(MODEMDEVICE,O_RDWR | O_NOCTTY); if(fd<0) { perror(MODEMDEVICE); exit(1); } printf(" Open.../n "); /*将目前终端机的结构保存至oldtio结构*/ tcgetattr(fd,&oldtio); /*清除newtio结构,重新设置通信协议*/ bzero(&newtio,sizeof(newtio)); /*通信协议设为8N1*/ newtio.c_cflag =BAUDRATE |CS8|CLOCAL|CREAD; //波特率 8个数据位 本地连接 接受使能 newtio.c_iflag=IGNPAR; //忽略奇偶校验错误 newtio.c_oflag=0; /*设置为正规模式*/ newtio.c_lflag=ICANON; //规范输入 /*清除所有队列在串口的输出*/ tcflush(fd,TCOFLUSH); /*新的termios的结构作为通信端口的参数*/ tcsetattr(fd,TCSANOW,&newtio); printf("Writing.../n "); ///* while(*(char*)p != 0) { int res = 0; res = write(fd,(char*)p, 1); if(res != 1) printf("send %c error/n", *(char*)p); else printf("send %c ok/n", *(char*)p); ++p; } printf("Close.../n"); close(fd); /*还原旧的通信端口参数*/ tcsetattr(fd,TCSANOW,&oldtio); printf("leave send thread/n"); } /* 开始线程 thread_fun 线程函数 pthread 线程函数所在pthread变量 par 线程函数参数 COM_STATU 线程函数状态控制变量 1:运行 0:退出 */ int start_thread_func(void*(*func)(void*), pthread_t* pthread, void* par, int* COM_STATU) { *COM_STATU = 1; memset(pthread, 0, sizeof(pthread_t)); int temp; /*创建线程*/ if((temp = pthread_create(pthread, NULL, func, par)) != 0) printf("线程创建失败!/n"); else { int id = pthread_self(); printf("线程%u被创建/n", *pthread); } return temp; } /* 结束线程 pthread 线程函数所在pthread变量 COM_STATU 线程函数状态控制变量 1:运行 0:退出 */ int stop_thread_func(pthread_t* pthread, int* COM_STATU) { printf("prepare stop thread %u/n", *pthread); *COM_STATU = 0; if(*pthread !=0) { pthread_join(*pthread, NULL); } printf("线程%d退出!/n", *COM_STATU); } void printtid(void) { int id = pthread_self(); printf("in thread %u/n", id); } int main() { pthread_t thread[2]; printtid(); const int READ_THREAD_ID = 0; const int SEND_THREAD_ID = 1; int COM_READ_STATU = 0; int COM_SEND_STATU = 0; if(start_thread_func(com_read, &thread[READ_THREAD_ID], &COM_READ_STATU, &COM_READ_STATU) != 0) { printf("error to leave/n"); return -1; } printf("wait 3 sec/n"); sleep(3); printf("wake after 3 sec/n"); if(start_thread_func(com_send, &thread[SEND_THREAD_ID], "ABCDEFGHIJKLMNOPQRST", &COM_SEND_STATU) != 0) { printf("error to leave/n"); return -1; } printtid(); printf("wait 10 sec/n"); sleep(10); printf("wake after 10 sec/n"); stop_thread_func(&thread[READ_THREAD_ID], &COM_READ_STATU); stop_thread_func(&thread[SEND_THREAD_ID], &COM_SEND_STATU); return 0; }
涉及到线程基础知识和串口知识