Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.12.161.77] |
|
Сообщ.
#1
,
|
|
|
Народ, может кто-нть чего-нть подскажет?
Суть проблемы такова: Есть несколько девайсов, объединенных в сеть RS485. Необходимо прочитать с них некоторую информацию при помощи палма. Чтение данных осуществляется следующим образом: - формат посылки: старт-бит, 9*бит данных, стоп-бит; * те, кто знаком с микроконтролерами 89с51 и т.п., наверное помнят, что девятый бит используется для определения адреса микроконтроллера в сети - непосредственно чтение данных: а) послать несколько байт (адрес устройства, контрольная сумма и т.д.) при установленном 9-м бите (В9=1); б) если пришел определенный ответ от соответствующего девайса, то передать ему команду (опять же несколько байт, но уже при В9=0); в) если необходимо еще что-то прочитать, то повторить шаги а и б. На РС с этим никаких проблем - 9-й бит эмулируется при помощи бита паритета (parity=mark или space (1/0)), ошибки паритета при приеме игнорируются, в общем все хорошо и просто до безобразия На палме же есть такие заморочки: а) parity=mark или space отсутствует напрочь, т.е. другого способа, кроме как самому считать паритет и в зависимости от этого устанавливать настройки порта (слишком медленно все это, девайс соответственно таймаут отрабатывает и ничегошеньки е присылает в ответ ) я не нашел :( б) не видно никакой возможности задавить возникающие при приеме ошибки паритета, т.е. если я вызываю что-нть вроде SerReceiveCheck или SerReceive то ничего кроме Line Error в ответ не получаю Вроде как это можно решить, написав Serial Driver ???, но в PalmOS SDK и Companion к нему информации крайне мало. Соответственно, вопрос: 1) может быть, кто-нибудь занимался подобным извратом и может что-нть подсказать и 2) если у кого-нибудь есть ссылки по этой тематике (особенно Serial Drivers), киньте плз .... Best Regards, dW |
Сообщ.
#2
,
|
|
|
Под 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 чтобы правильно передать и особенно принять байт(ы) ! |
Сообщ.
#3
,
|
|
|