zoukankan      html  css  js  c++  java
  • LInux tty 非阻塞配置以及安全读取数据方法

    • 串口配置

        char read_data[10], *write_char = "abcd01234";
        int fd_a, fd_b, read_len = 0,  strcmp_result = -1;
    
        bzero(read_data, 10);
    
        // O_NOCTTY 就是非阻塞配置
        fd_a = open(com_name_a, O_RDWR | O_NOCTTY);
        if (fd_a < 0) {
            goto ERR0;
        }
    
        fd_b = open(com_name_b, O_RDWR | O_NOCTTY);
        if (fd_b < 0) {
            goto ERR1;
        }
    
        config_uart(fd_a, 115200);
        config_uart(fd_b, 115200);
    
    static bool config_uart(int uart_fd, int speed) {
        static  struct termios termold, termnew;
    
        if(tcgetattr(uart_fd, &termold) != 0)
        {
            return false;
        }
        bzero(&termnew, sizeof(termnew));
        termnew.c_iflag &= ~(ICRNL | IGNCR) ;
        termnew.c_cflag |= CLOCAL | CREAD;   //CLOCAL:忽略modem控制线  CREAD:打开接受者
        termnew.c_cflag &= ~CSIZE;
        termnew.c_cflag |= CS8;
        termnew.c_cflag &= ~PARENB;
    
        switch(speed)
        {
            case 2400:
                cfsetispeed(&termnew, B2400);
                cfsetospeed(&termnew, B2400);
                break;
            case 4800:
                cfsetispeed(&termnew, B4800);
                cfsetospeed(&termnew, B4800);
                break;
            case 9600:
                cfsetispeed(&termnew, B9600);
                cfsetospeed(&termnew, B9600);
                break;
            case 115200:
                cfsetispeed(&termnew, B115200);
                cfsetospeed(&termnew, B115200);
                break;
            case 460800:
                cfsetispeed(&termnew, B460800);
                cfsetospeed(&termnew, B460800);
                break;
            default:
                cfsetispeed(&termnew, B115200);
                cfsetospeed(&termnew, B115200);
                break;
        }
        termnew.c_cflag &=  ~CSTOPB;
        termnew.c_cc[VTIME]  = 1;    //VTIME:非cannoical模式读时的延时,以十分之一秒位单位
        // 这里是没有读取数据 0.1 S 就退出读取
        termnew.c_cc[VMIN] = 0;       //VMIN:非canonical模式读到最小字符数
        // 这个参数配置为 0 就是非阻塞
        tcflush(uart_fd, TCIFLUSH);
        // 改变在所有写入 fd 引用的对象的输出都被传输后生效,所有已接受但未读入的输入都在改变发生前丢弃。
        if((tcsetattr(uart_fd, TCSANOW,&termnew)) != 0)   //TCSANOW:改变立即发生
        {
            return false;
        }
        return true;
    }
    
    static int safety_read(int fd, char *read_data, unsigned int data_len) {
        unsigned int len = 0;
        //char byte_data;
    
        // 安全读取就是一个个读取,然后合成在一起。
        while(data_len) {
            //bzero(&byte_data, 1);
            len += read(fd, read_data + len, 1);
            data_len--;
        }
        LOGI("%s", read_data);
        LOGI("%d", len);
    
        return len;
    }
    
  • 相关阅读:
    Allegro PCB Design GXL (legacy) 使用slide无法将走线推挤到焊盘的原因
    OrCAD Capture CIS 16.6 导出BOM
    Altium Designer (17.0) 打印输出指定的层
    Allegro PCB Design GXL (legacy) 将指定的层导出为DXF
    Allegro PCB Design GXL (legacy) 设置十字大光标
    Allegro PCB Design GXL (legacy) 手动更改元器件引脚的网络
    magento产品导入时需要注意的事项
    magento url rewrite
    验证台湾同胞身份证信息
    IE8对css文件的限制
  • 原文地址:https://www.cnblogs.com/chenfulin5/p/12880701.html
Copyright © 2011-2022 走看看