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;
}
原文地址:https://www.cnblogs.com/void0/p/4259095.html