LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 851|回复: 6

不明白用C++写的串口驱动的一小段代码

[复制链接]
发表于 2005-4-19 15:14:41 | 显示全部楼层 |阅读模式
set_Parity(int fd,int databits,int stopbits,int parity)                  
{                                                                                                
        struct termios options;                                                
         if  ( tcgetattr( fd,&options)  !=  0)                                
         {         
             perror("SetupSerial 1");
             return(FALSE);
         }
        options.c_cflag &= ~CSIZE;                                    /*第 9 行*/
        switch (databits) /*设置数据位数*/
        {
           case 7:
                  options.c_cflag |= CS7;
                  break;
           case 8:
                options.c_cflag |= CS8;
                break;
         default:
                fprintf(stderr,"Unsupported data size\n");
                return (FALSE);
        }
        switch (parity)
          {
           case 'n':
         case 'N':
                options.c_cflag &= ~PARENB;  /* Clear parity enable   第26行*/
                options.c_iflag &= ~INPCK;  /* Enable parity checking 第27行*/
                break;
         case 'o':
         case 'O':
                 options.c_cflag |= (PARODD | PARENB);  /* 设置为奇效验*/
                options.c_iflag |= INPCK;             /* Disnable parity checking */
                break;
         case 'e':
         case 'E':
                options.c_cflag |= PARENB;     /* Enable parity */
                options.c_cflag &= ~PARODD;   /* 转换为偶效验   第37行*/                                     options.c_iflag |= INPCK;       /* Disnable parity checking */
                break;
         case 'S':
         case 's':  /*as no parity*/
                options.c_cflag &= ~PARENB;
                options.c_cflag &= ~CSTOPB; /*第 43 行*/
                break;
         default:
                fprintf(stderr,"Unsupported parity\n");
                return (FALSE);
                }
         /* 设置停止位*/   
        switch (stopbits)
          {
           case 1:
                  options.c_cflag &= ~CSTOPB;
                break;
         case 2:
                options.c_cflag |= CSTOPB;
                break;
         default:
                fprintf(stderr,"Unsupported stop bits\n");
                return (FALSE);
        }
       /* Set input parity option */
      if (parity != 'n')
                  options.c_iflag |= INPCK;
                options.c_cc[VTIME] = 150; // 15 seconds
                options.c_cc[VMIN] = 0;
                tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */
      if (tcsetattr(fd,TCSANOW,&options) != 0)
          {
                  perror("SetupSerial 3");
                return (FALSE);
        }
       return (TRUE);
}


第6、26、27、43行是怎么理解的,可否跟偶解释一下。
还有“~”这个符号是什么意思啊??
发表于 2005-4-19 15:22:54 | 显示全部楼层
这是C++?我怎么没看出来?如果是C++,那C又是什么样的?

~是取补码,就是按位取反。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-19 20:12:21 | 显示全部楼层
大虾可否跟我解释一下第9行?小弟很烂。谢谢指教!
回复 支持 反对

使用道具 举报

发表于 2005-4-19 23:23:11 | 显示全部楼层
flag &= ~mask 就是 flag = flag & (~mask),目的是将flag中的某些位(由mask决定)清零。

flag |= mask 就是 flag = flag | mask,目的是将flag中的某些位(由mask决定)置为1。

如果还不明白,应该去看C语言课本。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-20 02:02:33 | 显示全部楼层
兄弟,明白!
要是我想改成C++会不会很难!
说明一下哦!!
谢谢咯!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-20 02:03:16 | 显示全部楼层
要不要改很多啊》??
回复 支持 反对

使用道具 举报

发表于 2005-4-20 09:33:19 | 显示全部楼层
需要改成c++吗?直接用g++编译不就行了?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表