проблема с чтением с ком порта linux

программирование Linux C++ COM

Мучаюсь уже который день, приведу свой пример, видимо я работаю не в режиме запрос, ответ сообственно настройки порта и чтение :

int fd;
struct termios oldtio,newtio;
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NDELAY );
if (fd <0) {perror(MODEMDEVICE); return 0; }
tcgetattr(fd,&oldtio);
bzero(&newtio, sizeof(newtio));
newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR;
newtio.c_oflag =0;
newtio.c_lflag = 0;
newtio.c_cc[VTIME] = 0;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
return fd;
теперь как читаю или пишу в него
n = select(fd+1, &input, NULL, NULL, &timeout);
if(n > 0)
{
res = read(fd,buf,1);
if(res<=0)
return -1;
}
else
return -1;
n = write(fd,"\x06",1);
if(n<=0)
return -1;
n = select(fd+1, &input, NULL, NULL, &timeout);
if(n > 0)
{
res = read(fd,buf,255);
if(res<=0)
return -1;
if(buf[2]!='\x00')
{
ErrorKKM(buf);
return -1;
}
}
else
return -1;
n = write(fd,"\x06",1);
if(n!=1)
return -1;
n = select(fd+1, &input, NULL, NULL, &timeout);
if(n > 0)
{
res = read(fd,buf,1);
if(res<=0)
return -1;
}
else
return -1;
return 0;
логика такая
прочитать от устройства запрос , после отправить ему что все ок , после прочитать у него данные , данные , после отправить ему подтверждение что все ок и после он присылает байт о том что передача закончена
strace показывает мне совсем другое
ответ о том что нет ошибок должен быть вида \2\U\0\0\3\CRC но я получаю \2 и после сразу же отправляю ему о том что все ок , хотя селектом вроде ставлю таймаут
вообщем подскажите кто что может
этот пример частный случай, подтверждение о какой-либо команде выполнения, т.е. выполнилась с ошибками или нет, что говорит как раз 3 байт что 0 ошибок нет либо там будет не 0

Примечание:
пробовал без опции O_NDELAY без селектов и читать определенное колличество байт, все равно недочитывает их и начинает писать в порт

Примечание:
проблема решена, читал байты быстрее чем железо их писало
Ответы:
Так дяденька, вы ж ему сам O_NDELAY при открытии передали.
Убирайте этот флаг и сидите в read(), пока р̶а̶к̶ н̶а̶ г̶о̶р̶е̶ н̶е̶ с̶в̶и̶с̶т̶н̶е̶т̶ запрошенное количество байт не придёт, либо перерабатывайте логику проверки байт в канале и их считывания. setvbuf() не забудьте.


13 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.