LINUX.ORG.RU

[c++] com порт проверка на подключенность

 


0

1

Здравствуйте. В программе испльзуется устройство по com порту, и если его отключить и начать обращаться к устройству, программа зависает. Вот, как бы так сделать чтобы проверка происходила на подключенность устройства к порту. termios перенастраивать нельзя.

Ответ на: комментарий от pozitiffcat

я же говорил, что в неблокирующем режиме необходимо контролировать ввод/вывод самостоятельно:

int write_data(int fd, const void *data, size_t len) {
    struct pollfd pfd;
    pfd.fd = fd;
    pfd.events = POLLOUT;
    while (poll(&pfd, 1, -1) > 0) {
        ssize_t n = write(fd, data, len);
        if (n < 0)
            break;
        len -= n;
        if (len == 0)
            return 0;
        data = (const char *)data + n;
    }
    return -1;
}

— вернётся, когда запишет все данные (или произойдёт ошибка). в случае ошибки вернёт -1, иначе 0.

и:

ssize_t read_data(int fd, void *data, size_t len) {
    ssize_t retval = 0;
    struct pollfd pfd;
    pfd.fd = fd;
    pfd.events = POLLIN;
    while (poll(&pfd, 1, 100) > 0) {
        ssize_t n = read(fd, data, len);
        if (n < 0)
            break;
        len -= n;
        retval += n;
        if (len == 0)
            break;
        data = (char *)data + n;
    }
    return retval;
}

— вернётся, когда прочитает len байт, произойдёт ошибка или в порту не будет данных дольше 0.1 сек. вернёт количество прочитанных байт.

arsi ★★★★★
()
Ответ на: комментарий от vga

смотря какие объёмы данных гонять :) если солидные, то лучшее решение, имхо, — нити. а если пару сотен байт с прибора получить на 115200, то за 0.02 сек справимся. если прибор отлетит при этом, то потерять 0.1 сек — не так уж много. это если прибор передаёт данные фиксированного/прогнозируемого размера. если нет и вылет по таймауту — штатная ситуация, то сам таймаут лучше высчитывать исходя из скорости передачи, и он будет намного меньшим (при 115200, например, даже 1мс много).

arsi ★★★★★
()
Ответ на: комментарий от arsi

Я имел ввиду гуй будет тормозить, особенно если данных нет, это же все в гуевой нити будет. QSocketNotifier таки самое правильно решение, хотя и нити покатят, но я их не люблю :-).

vga ★★
()
Ответ на: комментарий от vga

смотря как/какой обмен идёт. если, например, по кнопке необходимо отправить запрос и получить ответ, то полсекунды лага, скорее всего, будет приемлемо. здесь хотелось бы услышать комментарий ТС-а, а то мы тут спорим о сферическом девайсе в вакууме… ;)

arsi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.