Parzysto

Potrzebujesz pomocy z C, C++, perl, python, itp.
bernat
Posty: 4
Rejestracja: 16 grudnia 2011, 19:07

Parzystość - port szeregowy

Post autor: bernat »

Witam.

Piszę program obsługujący urządzenie podłączone przez port COM. W kodzie jądra. w pliku ,,drivers/char/n_tty.c'' jest taka procedura obsługująca (mam nadzieję) błąd parzystości:

Kod: Zaznacz cały

static inline void n_tty_receive_parity_error(struct tty_struct *tty,
                                              unsigned char c)
{
        if (I_IGNPAR(tty))
                return;
        if (I_PARMRK(tty)) {
                put_tty_queue('\377', tty);
                put_tty_queue('\0', tty);
                put_tty_queue(c, tty);
        } else  if (I_INPCK(tty))
                put_tty_queue('\0', tty);
        else
                put_tty_queue(c, tty);
        wake_up_interruptible(&tty->read_wait);
}
Wynika z niej, że jeśli mam ustawioną dla portu szeregowego opcję PARMRK, to INPCK nie powinna mieć znaczenia. A niestety eksperymentalnie sprawdziłem, że tak nie jest tzn. jeśli mam ustawione

Kod: Zaznacz cały

newtio.c_iflag = IGNCR | INPCK | PARMRK ;
To rzeczywiście bajty z błędem parzystości są poprzedzane bajtami:

Kod: Zaznacz cały

 \377 \0
Natomiast, jeśli mam ustawione tylko:

Kod: Zaznacz cały

newtio.c_iflag = IGNCR | PARMRK ;
to bajty z błędem parzystości są przepuszczane wszystkie, bez poprzedzenia bajtami:

Kod: Zaznacz cały

 \377 \0
Dlaczego tak się dzieje?

Pozdrawiam.

Piotr
ODPOWIEDZ