c语言中串口打开和设置函数

int open_port(int fd,int comport){
    char *dev[]={"/dev/ttySAC0","/dev/ttySAC1","/dev/ttySAC2"};
    if(comport==0)
    {
        //串口0
        fd=open("/dev/ttySAC0",O_RDWR|O_NOCTTY|O_NDELAY);
        if(-1==fd)
        {
            perror("Can't Open Serial Port 0");
            return(-1);
        }
    }
    else if(comport==1)
    {   
        //串口1
        fd=open("/dev/ttySAC1",O_RDWR|O_NOCTTY|O_NDELAY);
        if(-1==fd)
        {
            perror("Can't Open Serial Port 1");
            return(-1);
        }
    }
    else if(comport==2)
    {       //串口2
        fd=open("/dev/ttySAC2",O_RDWR|O_NOCTTY|O_NDELAY);
        if(-1==fd)
        {
            perror("Can't Open Serial Port 2");
            return(-1);
        }
    }
    
    if(fcntl(fd,F_SETFL,0)<0)
    {
            printf("fcntl failed!\n");
        }
    
    if(isatty(STDIN_FILENO)==0)
        {
        printf("standard input is not a termina device\n");
        }

    printf("fd=%d\n",fd);
    return fd;
}

int set_opt (int fd, int nSpeed, int nBits, char nEvent, int nStop) {
    
    struct termios newtio, oldtio;
    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)
    { //TCSANOW:改变的配置立即生效
        perror ("com set error");
        return -1;
    }
    printf ("set done!\n");
    return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值