Как обнаружить переполнение буфера на последовательном порту в Linux с помощью C ++ - PullRequest
3 голосов
/ 01 июля 2010

У меня большая проблема. В настоящее время я получаю доступ к последовательному порту через следующие хуки:

fd = open( "/dev/ttyS1", O_RDWR | O_NOCTTY )

тогда я читаю из него, используя следующий фрагмент кода

i = select( fd + 1, &rfds, NULL, NULL, &tv )
...
iLen = read( fd, buf, MAX_PACKET_LEN )

проблема в том, что перед чтением мне нужно определить, не было ли переполнения буфера. Как на уровне последовательного порта, так и во внутренних буферах tty.

Мы попытались cat /proc/tty/driver/serial, но, похоже, в нем не перечислены переполнения (см. Вывод ниже)

1: uart:16550A port:000002F8 irq:3 tx:70774 rx:862484 fe:44443 pe:270023 brk:30301 RTS|CTS|DTR

Ответы [ 2 ]

2 голосов
/ 01 июля 2010

Согласно источникам ядра, вы должны использовать TIOCGICOUNT ioctl. Третий аргумент ioctl должен быть указателем на следующую структуру, определенную в <linux/serial.h>:

/*
 * Serial input interrupt line counters -- external structure
 * Four lines can interrupt: CTS, DSR, RI, DCD
 */
struct serial_icounter_struct {
        int cts, dsr, rng, dcd;
        int rx, tx;
        int frame, overrun, parity, brk;
        int buf_overrun;
        int reserved[9];
};

Я не знаю, обнаружит ли каждый водитель все условия.

0 голосов
/ 14 августа 2013

Темный Темплер,

Ваш драйвер последовательного порта должен обновить ошибки icount.frame / overrun.

struct uart_port в serial_core.h имеет член struct uart_icount, который должен обновляться в драйвере последовательного устройства платформы в соответствии с полученными прерываниями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...