tags:

views:

34

answers:

1

Hey Guys

We have a big problem. At present we are accessing a serial port via the following hooks

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

then we read from it using the following chunk of code

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

the problem is that before we read, we need to detect if there has been any buffer over runs. Both at the serial port level and the internal tty flip buffers.

We tried "cat /proc/tty/driver/serial" but it doesn't seem to list the overruns (see output below)

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

Please help

+1  A: 

According to the kernel sources, you should use the TIOCGICOUNT ioctl. The third ioctl argument should be a pointer to the following struct, defined in <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];
};

I don't know if every driver detect all conditions however.

shodanex
Hey, thanks for this, but it seems, that our system is not updating the "overrun" and "buf_overrun" fields.Any idea why?
Dark Templer