利用select接收串口数据 亲测可用小demo

本文介绍了一个基于Linux环境下的串口通信程序实现方法,通过设置串口参数并使用多线程技术来实时接收和打印串口数据。程序详细展示了串口打开、配置以及数据读取的过程。
/*开启一个线程,用于接收串口数据并打印*/
#include     <stdio.h>  
#include     <stdlib.h>   
#include     <unistd.h>    
#include     <sys/types.h>  
#include     <sys/stat.h>  
#include     <fcntl.h>   
#include     <termios.h>  
#include     <errno.h>  
#include     <string.h>  
#include     <pthread.h>

int fd; 
fd_set rd;
void pthread_uartrecv(void)
{
    struct timeval tv;
    tv.tv_sec = 0;
    tv.tv_usec = 10000;
    
    int nread;
    char buff[8];
    bzero(buff,8);
    while(1)
    {
	FD_ZERO(&rd);
  	FD_SET(fd,&rd);
	//printf("here2\n");
  	if(FD_ISSET(fd,&rd))
  	{
	    //printf("here1\n");
    	    select(fd+1,&rd,NULL,NULL,NULL);
      	    nread = read(fd,buff,8);
	    buff[nread]='\0';
            printf("nread = %d,%s\n",nread,buff); 
        }
    }
}
    
int main()  
{  
     
    struct termios opt;   
    fd = open("/dev/ttyUSB0", O_RDWR|O_NOCTTY|O_NDELAY);    
    fcntl(fd, F_SETFL, 0); 

    tcgetattr(fd, &opt);        
    cfsetispeed(&opt, B9600);  
    cfsetospeed(&opt, B9600);  
    if(tcsetattr(fd, TCSANOW, &opt) != 0 )  
    {       
       perror("tcsetattr error1");  
       return -1;  
    }  
    opt.c_cflag &= ~CSIZE;    
    opt.c_cflag |= CS8;     
    opt.c_cflag &= ~CSTOPB;   
    opt.c_cflag &= ~PARENB;   
    opt.c_iflag &= ~INPCK;//opt.c_cflag &= ~INPCK;the last this is fault set  
    opt.c_cflag |= (CLOCAL | CREAD);  
    opt.c_cflag &= ~CRTSCTS;
    opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);  
    opt.c_oflag &= ~OPOST;  
    opt.c_oflag &= ~(ONLCR | OCRNL);    //添加的  
    opt.c_iflag &= ~(ICRNL | INLCR);  
    opt.c_iflag &= ~(IXON | IXOFF | IXANY);    //添加的   
    opt.c_cc[VTIME] = 8;  
    opt.c_cc[VMIN] = 10;  
      
    tcflush(fd, TCIOFLUSH);  
   
    printf("configure complete\n");  
     
    if(tcsetattr(fd, TCSANOW, &opt) != 0)  
    {  
        perror("serial error");  
        return -1;  
    }   
    
    pthread_t id;
    pthread_create(&id,NULL,(void*)pthread_uartrecv,NULL);
  
    while(1)  
    {    
        sleep(2);
	printf("this is main function\n");
    }  
}






                
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值