конфигурация сом-порта в linux

Вопрос такой, нужно обеспечить прием/передачу байтов в raw режиме через usb ch341 устройства в Debian 11.3. В целом прием работает, но read вешается до получения символа конца строки, хотя вроде бы по флагам я его в неканонический вид(raw) перевожу. Не получается подобрать набор флагов, чтобы передавать голые байты(без '\n'). Пример конфигурации порта указал ниже. Может кто имел такую проблему.

int fd = open("/dev/ttyUSB0",O_RDWR | O_NOCTTY/*| O_NDELAY*/);

    if(fd < 0){
        perror("Error:");
        exit(0);
    }

    cout<<"port opened!\n";

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    termios settings;
    tcgetattr(fd,&settings);

    cfsetispeed(&settings,B9600);
    cfsetospeed(&settings,B9600);

    settings.c_cflag &= ~PARENB;        //noparity
    settings.c_cflag &= ~CSTOPB;        //1 stopbit
    settings.c_cflag &= ~CSIZE;         //clear the mask for settings the data size
    settings.c_cflag |= CS8;            //databits = 8

    settings.c_cflag &= ~CRTSCTS;       //no hardware flow control
    settings.c_cflag |= (CREAD|CLOCAL);   //enable receiver, ignore modem control lines

    settings.c_iflag &= ~(IXON|IXOFF|IXANY);// disable program flow control
    settings.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL);

    settings.c_lflag &= ~(ICANON|ECHO|ECHOE|ECHONL|ISIG);// non canonical mode

    settings.c_oflag &= ~OPOST;         //no output processing
    //settings.c_oflag &= ~ONLCR;

    //cfmakeraw(&settings);

    settings.c_cc[VMIN] = 1;
    settings.c_cc[VTIME] = 1;

    if(tcsetattr(fd,TCSANOW,&settings) != 0)
        cout <<"error caused in settings!\n";
    else
        cout<<"settings:    baudrate=9600,stopbits=1,parity=none\n"; 

    char rbuffer{};

    while (true) {
        //tcflush(fd,TCIFLUSH);//discard old data in rx buffer
        read(fd,&rbuffer,sizeof(rbuffer));
        cout<<rbuffer;
    }

Ответы (2 шт):

Автор решения: eri

Рекомендую select и O_NONBLOCK. Будет вычитывать блоками от одного байта до размера буфера. Склеивать пакеты вам всё равно вручную, раз терминатора \n нет.

→ Ссылка
Автор решения: Федор

Нужно сбрасывать буфер после получения байта вызовом cout.flush();.

→ Ссылка