конфигурация сом-порта в 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
нет.