zoukankan      html  css  js  c++  java
  • C串口通信

    目录

    1、串口配置函数

    2、打开串口

    3、读写串口

    总结:这些程序都是从书上抄来的,都是最最简单的程序,写在这里只是想写个大概的思路,具体的函数说明可以看书,其中值得说的就是两个函数,一个是

    fcntl(fd,F_SETFL,0)//恢复串口为阻塞模式

    还有一个是select(fd+1,&rd,NULL,NULL,NULL)//利用select函数来实现多个串口的读写


    1、串口配置函数

      

    /**************************************************************
    功能描述:使串口设置参数生效
    **************************************************************/ 
    int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
    {
        struct termios newtio,oldtio;
        printf("Initial......
    ");
        if  ( tcgetattr( fd,&oldtio)  !=  0) { 
            perror("SetupSerial 1");
            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;
        }
    
        switch( nEvent )
        {
        case 'O':
            newtio.c_cflag |= PARENB;
            newtio.c_cflag |= PARODD;
            newtio.c_iflag |= (INPCK | ISTRIP);
            break;
        case 'E': 
            newtio.c_iflag |= (INPCK | ISTRIP);
            newtio.c_cflag |= PARENB;
            newtio.c_cflag &= ~PARODD;
            break;
        case 'N':  
            newtio.c_cflag &= ~PARENB;
            break;
        }
    
    switch( nSpeed )
        {
        case 2400:
            cfsetispeed(&newtio, B2400);
            cfsetospeed(&newtio, B2400);
            break;
        case 4800:
            cfsetispeed(&newtio, B4800);
            cfsetospeed(&newtio, B4800);
            break;
        case 9600:
            cfsetispeed(&newtio, B9600);
            cfsetospeed(&newtio, B9600);
            break;
        case 115200:
            cfsetispeed(&newtio, B115200);
            cfsetospeed(&newtio, B115200);
            break;
        case 460800:
            cfsetispeed(&newtio, B460800);
            cfsetospeed(&newtio, B460800);
            break;
        default:
            cfsetispeed(&newtio, B9600);
            cfsetospeed(&newtio, B9600);
            break;
        }
        if( nStop == 1 )
            newtio.c_cflag &=  ~CSTOPB;
        else if ( nStop == 2 )
        newtio.c_cflag |=  CSTOPB;
        newtio.c_cc[VTIME]  = 0;
        newtio.c_cc[VMIN] = 0;
        tcflush(fd,TCIFLUSH);
        if((tcsetattr(fd,TCSANOW,&newtio))!=0)
        {
            perror("com set error");
            return -1;
        }
        printf("set done!
    ");
        return 0;
    }

    2、打开串口

      

    int open_port(int comport)
    {
        int fd;
        char *dev[]={"/dev/ttyS0","/dev/ttyS1","/dev/ttyS2","/dev/ttyUSB0"};
        long  vdisable;
        if (comport==1)
        {    fd = open( "/dev/ttyS0", O_RDWR|O_NOCTTY|O_NDELAY);
            if (-1 == fd){
                perror("Can't Open Serial Port");
                return(-1);
            }
        }
        else if(comport==2)
        {    fd = open( "/dev/ttyS1", O_RDWR|O_NOCTTY|O_NDELAY);
            if (-1 == fd){
                perror("Can't Open Serial Port");
                return(-1);
            }
        }
        else if (comport==3)
        {
            fd = open( "/dev/ttyS2", O_RDWR|O_NOCTTY|O_NDELAY);
            if (-1 == fd){
                perror("Can't Open Serial Port");
                return(-1);
            }
        }
        else
        {
            fd = open( "/dev/ttyUSB0", O_RDWR|O_NOCTTY|O_NDELAY);
            if (-1 == fd){
                perror("Can't Open Serial Port");
                return(-1);
            }
        }
        
        if(fcntl(fd, F_SETFL, 0)<0)
            printf("fcntl failed!
    ");
        else
            //printf("fcntl=%d
    ",fcntl(fd, F_SETFL,0));
            fcntl(fd, F_SETFL,0);
        if(isatty(STDIN_FILENO)==0)
            printf("standard input is not a terminal device
    ");
        else
            //printf("isatty success!
    ");
            ;
        //printf("fd-open=%d
    ",fd);
        return fd;
    }

    3、读写串口

      

    int main(void)
    {
        int fd;
        int nread,i;
        char buff[]="hello
    ";
        if(fd=open_port(fd,1)<0)
        {
            perror("open_port error");
            return;
        }
        if(i=set_opt(fd,115200,8,'N',1)<0)
        {
            perror("set_opt error");
            return;
        }
        printf("fd=%d
    ",fd);
        nread=read(fd,buff,8);//读串口
        printf("nread=%d,%s
    ",nread,buff);
        close(fd);
        return;
    }
    int main(void)
    {
        int fd;
        int nread,i;
        char buff[]="hello
    ";
        fd_set rd;
        if(fd=open_port(fd,1)<0)
        {
            perror("open_port error");
            return;
        }
        if(i=set_opt(fd,115200,8,'N',1)<0)
        {
            perror("set_opt error");
            return;
        }
        //利用select函数实现多个串口的读写
        FD_ZERO(&rd);
        FD_SET(fd,&rd);
        while(FD_ISSET(fd,&rd))
        {
            if(select(fd+1,&rd,NULL,NULL,NULL)<0)
            {
                perror("select");
            }
            else
            {
                while((nread=read(fd,buff,8))>0)
                {
                    printf("nread=%d,%s",nrade,buff);
                }
            }
        }
        close(fd);
        return;
    }
  • 相关阅读:
    算法------------数组----------------两个数组的交集 II
    算法-----------数组------------只出现一次的数字
    算法------数组---------存在重复元素
    androd hook acitivity 启动流程,替换启动的activity(Android Instrumentation)
    算法--------旋转数组
    Android 项目,没有可运行的Module项
    Java多线程系列目录(共43篇)
    python3:tuple元组
    python 3 :list
    python3 基本数据类型
  • 原文地址:https://www.cnblogs.com/void0/p/4259095.html
Copyright © 2011-2022 走看看