zoukankan      html  css  js  c++  java
  • Linux 多线程串口通信

    大概流程就是打开一个串口、然后进行串口设置。开启二个线程,一个线程写数据,另一个线程读数据。

    代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <errno.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <termios.h>
    #include <pthread.h>
    #include <sys/time.h>
    
    #define MAX 2
    pthread_t thread[2];
    pthread_mutex_t mut;
    int fd;
    
    int set_port(int fd,int  nbits)
    {
    	struct termios newtio,oldtio;
    	if(tcgetattr(fd,&oldtio)!=0)
    	{
    		perror("pei zhi cuo wu1
    ");
    		return -1;
    	}
    
    	bzero(&newtio,sizeof(newtio)); //清零
    	newtio.c_cflag |=CLOCAL|CREAD;//用于本地连接和接收使能
    
    	newtio.c_cflag &=~CSIZE;//设置数据位
    	switch(nbits)
    	{
    	case 7:
    		newtio.c_cflag |=CS7;break;
    	case 8:
    		newtio.c_cflag |=CS8;break;
    	}
    
    	//设置奇校验位
    		newtio.c_cflag |=PARENB;
    
    	//设置波特率
    		cfsetispeed(&newtio,B115200);
    		cfsetospeed(&newtio,B115200);
    
    		//设置停止位
    		newtio.c_cflag &=~PARENB;
    
    		if((tcsetattr(fd,TCSANOW,&newtio))!=0)
    		{
    			perror("pei zhi cuo wu2
    ");
    			return -1;
    		}
    
    		printf("bao cun wan bi 
    ");
    		return 0;
    	}
    
    
    void *thread1()
    {
    	int i;
    	printf ("thread1 
    ");
    	for( i=0;i<MAX;i++){
    		pthread_mutex_lock(&mut);
    		if(i==0){
    			printf("write  %d
    ",i+1);
    			char buf1[]="AT+FCLASS=0
    ";
    			int length=sizeof(buf1);
    			int j=write(fd,buf1,length);
    			puts(buf1);
    			if(j<0)printf("fa song shi bai
    ");
    			printf("%d   
    ",j);
    		}
    		else if(i==1){
    			printf("write  %d
    ",i+1);
    			char buf2[]="AT+CBST=7,0,0
    ";
    			int length=sizeof(buf2);
    			int j=write(fd,buf2,length);
    			puts(buf2);
    			if(j<0)printf("fa song shi bai
    ");
    			printf("%d   
    ",j);
    
    				}
    		sleep(3);
    		pthread_mutex_unlock(&mut);
    	}
    	printf("thread1 stop
    ");
    	pthread_exit(NULL);
    
    	}
    
    
    void *thread2()
    {
    	int j;
    		sleep(1);
            printf("thread2
    ");
            char buf[100];
            for (j = 0; j< MAX; j++)
            {
            pthread_mutex_lock(&mut);
            sleep(3);
            printf("read  %d
    ",j+1);
            int k=read(fd,buf,100);
            printf("k+%d
    ",k);
            puts(buf);
            pthread_mutex_unlock(&mut);
            sleep(2);
            }
            printf("thread2 :stop
    ");
            pthread_exit(NULL);
    
    }
    
    
    void thread_create(void)
     {
    	int temp;
         memset(&thread, 0, sizeof(thread));          //comment1
          /*创建线程*/
         if((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0)       //comment2
          printf("xian chegn 1 faile
    ");
          else
           printf("xian cheng 1 chegn gong
    ");
    
           if((temp = pthread_create(&thread[1], NULL, thread2, NULL)) != 0)  //comment3
             printf("2 faile
    ");
           else
                printf("2 surcess
    ");
            }
    
    
    
    void thread_wait(void)
    {
            /*等待线程结束*/
            if(thread[0] !=0) {                   //comment4
                    pthread_join(thread[0],NULL);
                    printf("1 stop 
    ");
            }
            if(thread[1] !=0) {                //comment5
                    pthread_join(thread[1],NULL);
                    printf("2 stop 
    ");
            }
    }
    
    
    int main(void) {
    		int i,j,k;
    		fd=open("/dev/ttyS2",O_RDWR|O_NOCTTY|O_NDELAY);
    		if(-1==fd)printf("mei da kai tong xin duan kou hao
    ");
    		else
    		{
    			i=set_port(fd, 8);
    			if(i<0)
    			{
    				perror("pei zhi cuo wu3
    ");
    				return 0;
    			}
    	        pthread_mutex_init(&mut,NULL);
    	        printf("creat preadth
    ");
    	        thread_create();
    	        printf("chu li 
    ");
    	        thread_wait();
    	    	close(fd);
    		}
    	        return 0;
    
    }
    

      

  • 相关阅读:
    Vue(小案例_vue+axios仿手机app)_go实现退回上一个路由
    nyoj 635 Oh, my goddess
    nyoj 587 blockhouses
    nyoj 483 Nightmare
    nyoj 592 spiral grid
    nyoj 927 The partial sum problem
    nyoj 523 亡命逃窜
    nyoj 929 密码宝盒
    nyoj 999 师傅又被妖怪抓走了
    nyoj 293 Sticks
  • 原文地址:https://www.cnblogs.com/lanye/p/3247669.html
Copyright © 2011-2022 走看看