The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Как принудительно установить бит четности в mark?"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Как принудительно установить бит четности в mark?"
Сообщение от alex emailИскать по авторуВ закладки on 04-Янв-04, 18:54  (MSK)
При работе с устр. через COM-порт,устройство шлёт первый байт с битом четности 1(принудительно установленным). Подскажите как его отследить и соответственно как установить бит четн. 1 ,чтобы отправить? Спасибо!!!
  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Как принудительно установить бит четности в mark?"
Сообщение от vnp emailИскать по авторуВ закладки on 05-Янв-04, 01:01  (MSK)
>При работе с устр. через COM-порт,устройство шлёт первый байт с битом четности
>1(принудительно установленным). Подскажите как его отследить и соответственно как установить бит
>четн. 1 ,чтобы отправить? Спасибо!!!

В разных устройствах четность форсируется по разному (если форсируется вообще), и во всяком случае не поддерживается драйвером tty; все придется делать руками.

В 16550 и ему подобных, четность форсируется выставлением LCR:5, и равна отрицанию LCR:4. Иначе говоря, перед отправкой вашего байта нужно
lcr |= 0x20; // Форсировать четность
lcr &= ~0x10; // Погасить lcr:4; бит четности станет 1

Поймать такое можно только если натуральная четность должна была бы быть нулем (в противном случае это обычная посылка); нужно следить за ошибкой четности -- LSR:2 выставлен.

Кажется, все. Не забудьте вернуть lcr в нормальное состояние.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Как принудительно установить бит четности в mark?"
Сообщение от aleks Искать по авторуВ закладки on 05-Янв-04, 15:04  (MSK)
>>При работе с устр. через COM-порт,устройство шлёт первый байт с битом четности
>>1(принудительно установленным). Подскажите как его отследить и соответственно как установить бит
>>четн. 1 ,чтобы отправить? Спасибо!!!
>
>В разных устройствах четность форсируется по разному (если форсируется вообще), и во
>всяком случае не поддерживается драйвером tty; все придется делать руками.
>
>В 16550 и ему подобных, четность форсируется выставлением LCR:5, и равна отрицанию
>LCR:4. Иначе говоря, перед отправкой вашего байта нужно
>lcr |= 0x20; // Форсировать четность
>lcr &= ~0x10; // Погасить lcr:4; бит четности станет 1
>
>Поймать такое можно только если натуральная четность должна была бы быть нулем
>(в противном случае это обычная посылка); нужно следить за ошибкой четности
>-- LSR:2 выставлен.
>
>Кажется, все. Не забудьте вернуть lcr в нормальное состояние.

Спасибо большое,но если можно поподробнее так как тема для меня новая.
Был бы очень рад если бы можно было с вами созвонится.Спасибо!!!

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Как принудительно установить бит четности в mark?"
Сообщение от vnp emailИскать по авторуВ закладки on 05-Янв-04, 21:52  (MSK)
>Спасибо большое,но если можно поподробнее так как тема для меня новая.
>Был бы очень рад если бы можно было с вами созвонится.Спасибо!!!

Созвониться можно, если вы тоже в Калифорнии. А так, пишите на vnp@bayarea.net. Чем смогу, помогу.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "Как принудительно установить бит четности в mark?"
Сообщение от alex emailИскать по авторуВ закладки on 05-Янв-04, 22:17  (MSK)
>>Спасибо большое,но если можно поподробнее так как тема для меня новая.
>>Был бы очень рад если бы можно было с вами созвонится.Спасибо!!!
>
>Созвониться можно, если вы тоже в Калифорнии. А так, пишите на vnp@bayarea.net.
>Чем смогу, помогу.

Спасибо вы очень помогли,но есть пара вопросов:
1 Что делать с LCR 3?
2 Как следить за LSR 2?
Если можно подробнее.Спасибо!!!

  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "Как принудительно установить бит четности в mark?"
Сообщение от vnp emailИскать по авторуВ закладки on 06-Янв-04, 05:22  (MSK)
> Спасибо вы очень помогли,но есть пара вопросов:
> 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.

> Если можно подробнее.Спасибо!!!


  Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "Как принудительно установить бит четности в mark?"
Сообщение от aleks emailИскать по авторуВ закладки on 06-Янв-04, 16:58  (MSK)
>> Спасибо вы очень помогли,но есть пара вопросов:
>> 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.
>
>
>> Если можно подробнее.Спасибо!!!

Ограменное спасибо!!!
А есть более удобный способ?

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру