На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование под PalmOS"
Правила раздела просты:
1. Будьте вежливыми.
2. Задавате вопросы только по теме. Пользовательские вопросы (у меня не работает пальм) являются оффтопиком. Пользуйтесь конференциями palmz.in, hpc.ru, ihand.ru .
3. Поиск вареза запрещен.
4. Пользуйтесь поиском. Не надейтесь, что кому-то доставляет удовольствие отвечать в сотый раз на один и тот же вопрос.
  
> Serial Port
    Народ, может кто-нть чего-нть подскажет?

    Суть проблемы такова:
    Есть несколько девайсов, объединенных в сеть RS485. Необходимо прочитать с них некоторую информацию при помощи палма. Чтение данных осуществляется следующим образом:

    - формат посылки: старт-бит, 9*бит данных, стоп-бит;
    * те, кто знаком с микроконтролерами 89с51 и т.п., наверное помнят, что девятый бит используется для определения адреса микроконтроллера в сети

    - непосредственно чтение данных:

    а) послать несколько байт (адрес устройства, контрольная сумма и т.д.) при установленном 9-м бите (В9=1);

    б) если пришел определенный ответ от соответствующего девайса, то передать ему команду (опять же несколько байт, но уже при В9=0);

    в) если необходимо еще что-то прочитать, то повторить шаги а и б.

    На РС с этим никаких проблем - 9-й бит эмулируется при помощи бита паритета (parity=mark или space (1/0)), ошибки паритета при приеме игнорируются, в общем все хорошо и просто до безобразия :D

    На палме же есть такие заморочки:

    а) parity=mark или space отсутствует напрочь, т.е. другого способа, кроме как самому считать паритет и в зависимости от этого устанавливать настройки порта (слишком медленно все это, девайс соответственно таймаут отрабатывает и ничегошеньки е присылает в ответ :( ) я не нашел  :(
    б)  не видно никакой возможности задавить возникающие при приеме ошибки паритета, т.е. если я вызываю что-нть вроде SerReceiveCheck или SerReceive то ничего кроме Line Error в ответ не получаю :( Вроде как это можно решить, написав Serial Driver ???, но в PalmOS SDK и Companion к нему информации крайне мало.

    Соответственно, вопрос: 1) может быть, кто-нибудь занимался подобным извратом и может что-нть подсказать и 2) если у кого-нибудь есть ссылки по этой тематике (особенно Serial Drivers), киньте плз ....

    Best Regards, dW


      Под Win-дой 9-й бит передаётся и принимается легко !
      Сперва при открытии порта в его структуре DCB надо поставить флаг fParity:

      GetCommState(HCOM, &dcb);
      ...
      ...
      dcb.fParity = 1;
      ...
      ...
      SetCommState(HCOM, &dcb);

      И дальше уже оперировать только параметром Parity из той же структуры DCB.
      Переключать флаг можно на ходу в любом месте и мгновенно, без всяких задержек !
      Делается это тремя строчками:

      Чтобы задать единичное состояние 9-го бита
      ...
      GetCommState(HCOM, &dcb);
      dcb.Parity = MARKPARITY;
      SetCommState(HCOM, &dcb);
      ...

      Чтобы задать нулевое состояние 9-го бита
      ...
      GetCommState(HCOM, &dcb);
      dcb.Parity = SPACEPARITY;
      SetCommState(HCOM, &dcb);
      ...

      после чего байты будут передаваться с единичным ( MARK ) или с нулевым ( SPACE ) 9-м битом не-зависимо от содержимого самого байта !
      Чтобы прочитать 9-й бит при приёме надо проверить состояние порта на момент приёма:

      ...
      COMSTAT ComStat;
      unsigned long ComErr;
      ...
      ClearCommError(HCOM, &ComErr, &ComStat);
      // кстати, cbComStat.cbInQue даёт число принятых байт в буфере приёмника, и их можно сразу прочитать.

      // проверяем состояние 9-го бита
      if (ComErr & CE_RXPARITY) ... ;
      ...

      Если состояние бита совпадает с текущей настройкой порта то проверка даст 0, если не совпадает - то 1

      Тут надо четко понимать что параметр dcb.Parity задаёт текущий режим всего порта как при передаче так и приёме.
      То есть, если мы поставили MARKPARITY то байт(ы) будут передаваться с 9-м битом установленным в 1,
      и если теперь принятые байты также имеют установленный MARK , то проверка (ComErr & CE_RXPARITY) даст 0 (false).

      Если теперь в порту установить режим SPACEPARITY , байты будут передаваться с нулевым 9-м битом,
      и если принятые байты также имеют нулевой 9-й бит, то при проверке (ComErr & CE_RXPARITY) тоже будет получен 0 (false).

      А вот когда установки режима отличаются на передаче и на приёме то (ComErr & CE_RXPARITY) будет давать 1 (true)
      Это может быть в разных случаях. Например, передатчик и приёмник находятся в разных устройствах (контроллер и компьютер), контроллер настроен на передачу 9-го бита, а комп ожидает SPACEPARITY , и при контроле бита получится 1.
      Может и на одном и том же компе - при передаче был режим MARKPARITY, потом быстро сменили на SPACEPARITY, и приём пойдет уже в режиме SPACE.

      Вобщем-то в основном и всё, довольно четко, ясно, и никаких гаданий над четностью устраивать не надо.
      Ещё раз повторюсь - главное не забыть какой в данный момент установлен режим - MARKPARITY или SPACEPARITY чтобы правильно передать и особенно принять байт(ы) !
        Спасибо за ответ! Всего 9 лет прошло ;)

        Сообщения были разделены в тему "Флуд"

        Сообщения были разделены в тему "Флуд"
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0179 ]   [ 15 queries used ]   [ Generated: 28.03.24, 11:52 GMT ]