> Спасибо вы очень помогли,но есть пара вопросов:
> 1 Что делать с LCR 3?
lcr:3 надо выставить, иначе бит четности не будет отправлен.
> 2 Как следить за LSR 2?
Всякий раз, когда в ресивере появляется байт, в lsr попадает информация об ошибках. В режиме опроса uarta, цикл выглядит примерно так:
while(1) {
// Ожидание прихода данных; проверяется статус ресивера
while((*lsr & 0x01) == 0)
;
// Байт пришел, можно читать другие биты
if((*lsr & 0x04) == 1) {
// lsr:2 выставлен -- случилась ошибка четности
...
}
// для порядка, можно убедиться, что других ошибок нет
// lsr:1 -- overrun; lsr:3 -- framing; lsr:4 -- break
if((*lsr & (0x02 | 0x08 | 0x10)) != 0) {
// Какая-то нежелательная ошибка
...
}
// Наконец, можно (если нужно) прочесть данные
data = *rhr;
}
Те же действия (только без циклов) надо делать в режиме прерываний.
Если же вы работаете с устройством как с /dev/tty, то проверка ошибки четности достигается примерно так (man tcsetattr):
struct termios tc;
tcgetattr(fd, &tc);
tc.c_iflag = INPCK | PARMRK; // Включить проверку четности
tcsetattr(fd, &rc);
Далее, при ошибке четности прочтется последовательность
0xff
0x00
собственно байт с ошибкой
Не самый удобный способ, к тому же не отличает parity от framing.
> Если можно подробнее.Спасибо!!!