Вот у меня тут есть одна интересная задача. Есть устройство, которое через коммуникационный порт общается с компом. Устройство желает получать данные блоками по 9 бит. 9-ый бит кодируется за счет бита-паритета. С посылкой данных в порт впринципе все ясно. Вопрос в следующем -- как мне анализировать значение этого 9 бита (или другими словами статус parity) при приеме данных ? Я так подозреваю, что надо ловить ошибку parity с помощью ClearCommError. Так это и делают, или я ошибаюсь, и есть какие-то более правильные способы ? И если все верно -- нельзя ли прислать в кач-ве примера -- как сие можно реализовать ? Предположим -- задача такая -- послать в порт 2 9-ти битовые послыки. В первой посылке 9-ый бит установлен, во второй сброшен. И соответственно прочитать эти посылки из порта, и если 9 бит установлен, то выставить 9bit=true; в противном случае 9bit=false;...
Кому не сложно -- ответьте плиз
Здравствуйте, blfox, Вы писали:
B>Вот у меня тут есть одна интересная задача. Есть устройство, которое через коммуникационный порт общается с компом. Устройство желает получать данные блоками по 9 бит. 9-ый бит кодируется за счет бита-паритета. С посылкой данных в порт впринципе все ясно. Вопрос в следующем -- как мне анализировать значение этого 9 бита (или другими словами статус parity) при приеме данных ? Я так подозреваю, что надо ловить ошибку parity с помощью ClearCommError. Так это и делают, или я ошибаюсь, и есть какие-то более правильные способы ? И если все верно -- нельзя ли прислать в кач-ве примера -- как сие можно реализовать ? Предположим -- задача такая -- послать в порт 2 9-ти битовые послыки. В первой посылке 9-ый бит установлен, во второй сброшен. И соответственно прочитать эти посылки из порта, и если 9 бит установлен, то выставить 9bit=true; в противном случае 9bit=false;...
B>Кому не сложно -- ответьте плиз 
Разве бит четности не устанавливается (проверяется) автоматически на уровне системы?
... << RSDN@Home 1.1.0 stable >>
Здравствуйте, Forint, Вы писали:
ве примера -- как сие можно реализовать ? Предположим -- задача такая -- послать в порт 2 9-ти битовые послыки. В первой посылке 9-ый бит установлен, во второй сброшен. И соответственно прочитать эти посылки из порта, и если 9 бит установлен, то выставить 9bit=true; в противном случае 9bit=false;...
B>>Кому не сложно -- ответьте плиз
F>Разве бит четности не устанавливается (проверяется) автоматически на уровне системы?
Нет.
Мы можем включить проверку четности и воспользоваться режимом дополнения по четности, или дополнения по нечетности. Тогда он будет выставляться автоматически... А можем сделать, что он будет всегда помеченным или сброшенным (режим parity=mark, parity=space). Вопрос только в том -- как прочитать из порта данные и получить этот 9-ый бит... Прочитай внимательно мое сообщение -- технологические сложности я описал...
Здравствуйте, blfox, Вы писали:
B>Здравствуйте, Forint, Вы писали:
B>ве примера -- как сие можно реализовать ? Предположим -- задача такая -- послать в порт 2 9-ти битовые послыки. В первой посылке 9-ый бит установлен, во второй сброшен. И соответственно прочитать эти посылки из порта, и если 9 бит установлен, то выставить 9bit=true; в противном случае 9bit=false;...
Если правильно понял, используется расширенный протокол СОМ портов (в AMD 186 есть такой, например).
B>>>Кому не сложно -- ответьте плиз
F>>Разве бит четности не устанавливается (проверяется) автоматически на уровне системы?
B>Нет.
B>Мы можем включить проверку четности и воспользоваться режимом дополнения по четности, или дополнения по нечетности. Тогда он будет выставляться автоматически... А можем сделать, что он будет всегда помеченным или сброшенным (режим parity=mark, parity=space). Вопрос только в том -- как прочитать из порта данные и получить этот 9-ый бит... Прочитай внимательно мое сообщение -- технологические сложности я описал...
Тут есть 2 проблемы.
1) НЕКОТОРЫЕ контроллеры СОМ портов УМЕЮТ это делать через специфические команды драйверам. Т.е. если всё важно и очень нужно ищщите товарищ в инете необходимых произодителей+описуху на дрова.
2) В случае использования обычных драйверов — кроме описанного тобой лёгкого пути нет. Ловить ошибку, более никак. Там ещё надо выставить 1 bit parity. Есть и другие режимы по умолчанию. Тут возникает вторая проблема — ты МОЖЕШЬ не получить сам байт, т.к. с точки зрения драйвера он фейк и ващще пусть идёт лесом. Тут надо теститровать под разными операционками и их билдами, самый поганый случай — это когда сама железка эти байты херит, т.е. драйвер отдаёт сплошняком нули, какой-то чипсет на АСУС маке грешил этим делом.
Здравствуйте, blfox, Вы писали:
B>Здравствуйте, Forint, Вы писали:
B>ве примера -- как сие можно реализовать ? Предположим -- задача такая -- послать в порт 2 9-ти битовые послыки. В первой посылке 9-ый бит установлен, во второй сброшен. И соответственно прочитать эти посылки из порта, и если 9 бит установлен, то выставить 9bit=true; в противном случае 9bit=false;...
Ну если уж так надо...
Передача:
Всё понятно.
Приём:
1. Читаем из порта по одному байту.
2. Используем ClearCommError на предмет наличия ошибки CE_RXPARITY.
2.1 если ошибка зафиксирована, определям каким должен быть бит четности по принятому байту и известным настройкам порта. Принятый бит четности имеет противоположное значение.
P.S. Смущает один момент, не уверен что при CE_RXPARITY будет что-то прочитано из порта... Никогда не пробовал.
... << RSDN@Home 1.1.0 stable >>