linux 串口编程记录(一)串口参数设置

    一些常用串口属性的设置方法。

  • 设置流控制
  • termios_new.c_cflag &= ~CRTSCTS; //不使用流控制
  • termios_new.c_cflag |= CRTSCTS; //使用硬件流控制
  • termios_new.c_iflag |= IXON|IXOFF|IXANY; //使用软件流控制

 

  • 屏蔽字符大小位
  • termios_new.c_cflag &= ~CSIZE;

 

  • 设置数据位大小
  • termios_new.c_cflag |= CS8; //使用8位数据位
  • termios_new.c_cflag |= CS7; //使用7位数据位
  • termios_new.c_cflag |= CS6; //使用6位数据位
  • termios_new.c_cflag |= CS5; //使用5位数据位

 

  • 设置奇偶校验方式
  • termios_new.c_cflag &= ~PARENB; //无奇偶校验
  •  
  • termios_new.c_cflag |= PARENB; //奇校验
  • termios_new.c_cflag &= ~PARODD;
  •  
  • termios_new.c_cflag |= PARENB; //偶校验
  • termios_new.c_cflag &= ~PARODD;

 

  • 停止位
  • termios_new.c_cflag |= CSTOPB; //2位停止位
  • termios_new.c_cflag &= ~CSTOPB; //1位停止位

 

  • 输出模式
  • termios_new.c_cflag &= ~OPOST; //原始数据(RAW)输出

 

  • 控制字符
  • termios_new.c_cc[VMIN] = 1; //读取字符的最小数量
  • termios_new.c_cc[VTIME] = 1; //读取第一个字符的等待时间

 

  • 关闭终端回显,键盘输入的字符不会在终端窗口显示。
  • #include <stdio.h>
  • #include <stdlib.h>
  • #include <termios.h>
  • #include <unistd.h>
  •  
  • int main(void)
  • {
  • struct termios ts,ots;
  • char passbuf[1024];
  •  
  • tcgetattr(STDIN_FILENO,&ts); /* STDIN_FILENO的值是1,表示标准输入的文件描述符 */
  • ots = ts;
  •  
  • ts.c_lflag &= ~ECHO; /* 关闭回终端回显功能*/
  • ts.c_lflag |= ECHONL;
  • tcsetattr(STDIN_FILENO,TCSAFLUSH,&ts); /* 应用新终端设置 */
  •  
  • fgets(passbuf,1024,stdin); /* 输入字符不会在终端显示 */
  • printf("you input character = %s/n",passbuf);
  •  
  • tcsetattr(STDIN_FILENO,TCSANOW,&ots); /* 恢复旧的终端设备 */

}

例子:串口参数设置函数

int Serial::SetPara(int serialfd,int speed,int databits , int stopbits ,int parity )

{    

  struct termios termios_new;

     bzero( &termios_new, sizeof(termios_new));//等价于memset(&termios_new,sizeof(termios_new));

    cfmakeraw(&termios_new);//就是将终端设置为原始模式

    termios_new.c_cflag=BaudRate(speed);

    termios_new.c_cflag |= CLOCAL | CREAD;   //  termios_new.c_iflag = IGNPAR | IGNBRK;

    termios_new.c_cflag &= ~CSIZE;

    switch (databits)

    {

    case 0:

        termios_new.c_cflag |= CS5;

        break;

    case 1:

        termios_new.c_cflag |= CS6;

        break;

    case 2:

        termios_new.c_cflag |= CS7;

        break;

    case 3:

        termios_new.c_cflag |= CS8;

        break;

    default:

        termios_new.c_cflag |= CS8;

        break;

    }

    switch (parity)

    {

    case 0:      //as no parity

        termios_new.c_cflag &= ~PARENB;    //Clear parity enable

        break;

    case 1:

        termios_new.c_cflag |= PARENB;     // Enable parity

        termios_new.c_cflag &= ~PARODD;

        break;

    case 2:

        termios_new.c_cflag |= PARENB;

        termios_new.c_cflag |= ~PARODD;

        break;

    default:

        termios_new.c_cflag &= ~PARENB;   // Clear parity enable

        break;

    }

    switch (stopbits)// set Stop Bit

    {

    case 1:

        termios_new.c_cflag &= ~CSTOPB;

        break;

    case 2:

        termios_new.c_cflag |= CSTOPB;

        break;

    default:  

       termios_new.c_cflag &= ~CSTOPB;

        break;

    }

    tcflush(serialfd,TCIFLUSH); // 清除输入缓存

   tcflush(serialfd,TCOFLUSH); // 清除输出缓存

    termios_new.c_cc[VTIME] = 1;   // MIN与 TIME组合有以下四种:1.MIN = 0 , TIME =0  有READ立即回传 否则传回 0 ,不读取任何字元

    termios_new.c_cc[VMIN] = 1;  //    2、 MIN = 0 , TIME >0  READ 传回读到的字元,或在十分之一秒后传回TIME 若来不及读到任何字元,则传回0

    tcflush (serialfd, TCIFLUSH);  //    3、 MIN > 0 , TIME =0  READ 会等待,直到MIN字元可读

    return tcsetattr(serialfd,TCSANOW,&termios_new);  //    4、 MIN > 0 , TIME > 0 每一格字元之间计时器即会被启动 READ 会在读到MIN字元,传回值或

}

int Serial::BaudRate( int baudrate)
{
    switch(baudrate)
    {
    case 0:
        return (B2400);
    case 1:
        return (B4800);
    case 2:
        return (B9600);
    case 3:
        return (B19200);
    case 4:
        return (B38400);
    case 5:
        return (B57600);
    case 6:
        return (B115200);
    default:
        return (B9600);
    }
}