• 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);
        }
    }

  • 相关阅读:
    《Effective C#中文版:改善C#程序的50种方法》读书笔记
    WPF总结
    定义集合属性(WPF)
    c#只读字段和常量的区别,以及静态构造函数的使用 .
    编程方法的参数
    关于事件的点滴总结
    线程间的消息(或数据)传递
    OOP的感悟
    VS2010快捷键大全----养成良好的习惯
    UTF-8里包括GB2312
  • 原文地址:https://www.cnblogs.com/starsKing/p/6073253.html
Copyright © 2020-2023  润新知