Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++: COM, OLE, ActiveX

Войти
Регистрация
Восстановить пароль
 
 
nzt
0 / 0 / 0
Регистрация: 26.09.2015
Сообщений: 22
#1

Чтение бита четности - C++ COM

06.10.2017, 10:13. Просмотров 301. Ответов 16

Здравствуйте.
У меня есть вопрос: Как считать бит четности через с++?
Написана программа которая будет общаться с устройством через компорт, передача и прием, и по ТЗ нужно использовать 9й бит для проверки. Пока все реализовано через виртуальные порты и на одном конце программа посылает сигналы а на другом возвращает обратно. И метод проверки - это устанавливать разные настройки в этих программах.

Я открываю порт как файл, и указываю при этом паритет, проверку на паритет, и сообщения об ошибках:
C++
1
2
3
4
    dcb.fParity = true;
    dcb.fErrorChar = true;
    dcb.fAbortOnError = true;
    dcb.Parity = ODDPARITY;
В одной программе, допустим, ODD, а в другой EVEN... и нифига. ReadFile не возвращает значение 0.
Погуглив, наткнулся на варианты : писать свой драйвер, или с помощью ассемблера добраться до цели. 1е мне кажется через чур сложным, 2е то что доступ возможен к определенному регистру определенного порта, но если у меня несколько портов, и я желаю переключаться?
Плюс нашел странный пост о том что fParity не робит от слова совсем.
Итого: можно ли получить 9й бит входящего байта через язык С++? Может я что то делаю не так? Если с спп надежды нет, можно ли через ассемблер работать с виртуальными портами, и вообще портами которые меняются?
Благодарю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2017, 10:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чтение бита четности (C++ COM):

Значение первого бита в файле преобразовать в цвет пикселя - C++
Если создал не в том разделе, прошу перенести в нужный. Спасибо, простите! Я не знаю как задать правильно вопрос или что мне искать в...

Построение помехозащитного кода для сообщения из символов алфавита с использованием бита четности - Turbo Pascal
Напишите программу построения помехозащитного кода для сообщения из символов заданного алфавита (алфавит англ.) с использованием бита...

Чтение и изменение бита в числе - VB
Доброго времени суток! Столкнулся с такой проблемой - через СOM порт от контроллера получаю массив байт данных, сохраняю их в виде...

Чтение RGB значений из bmp 24 бита - C#
Всем доброго времени суток. Вот такая проблема у меня: Есть 24-битный bmp рисунок(т.е. на каждый цвет по 8 бит). Как можно вытащить...

Чтение любого файла со второго бита (третьего и т.д.)? - Delphi
Подскажите пожалйста как открыть файл в мемо со второго бита (третьего и т.д.) Или как реализвать процедуру сдвига всего потока на один бит...

Как перехватить координаты бита на картинке в момент обнаружения этого бита - C#
есть картинка .Блокируем её в памяти.Пробегаемся по битам.Как перехватить координаты бита на картинке в момент обнаружения этого бита? ...

16
vxg
Модератор
3184 / 1987 / 227
Регистрация: 13.01.2012
Сообщений: 7,678
06.10.2017, 10:49 #2
Всегда думал что прикладному по не нужно читать этот бит - его читает и при желании программиста контролирует системное по
0
nzt
0 / 0 / 0
Регистрация: 26.09.2015
Сообщений: 22
06.10.2017, 11:12  [ТС] #3
vxg, системное по - ок, какое, и можно ли к нему получить доступ через С++ ?
0
vxg
Модератор
3184 / 1987 / 227
Регистрация: 13.01.2012
Сообщений: 7,678
06.10.2017, 18:12 #4
nzt, то самое которое обслуживает вызовы чтения записи данных
0
nzt
0 / 0 / 0
Регистрация: 26.09.2015
Сообщений: 22
09.10.2017, 09:34  [ТС] #5
vxg, Вы имеете в виду WriteFile/ReadFile ? К сожалению я вас не понимаю..
0
vxg
Модератор
3184 / 1987 / 227
Регистрация: 13.01.2012
Сообщений: 7,678
09.10.2017, 10:50 #6
nzt, если настроить порт передав в SetCommState dcb.fParity = TRUE порт должен фиксировать ошибки четности при передаче данных
0
nzt
0 / 0 / 0
Регистрация: 26.09.2015
Сообщений: 22
09.10.2017, 11:02  [ТС] #7
vxg, понял. А определить их .. как? Ожидать некоего мутного для меня эвента, или read/writefile должны возвращать ненулевое значение?
0
vxg
Модератор
3184 / 1987 / 227
Регистрация: 13.01.2012
Сообщений: 7,678
09.10.2017, 12:00 #8
nzt, при ошибке функция чтения должна вернуть ошибку иначе смысла в контроле нет. Имитировать можно наверное аппаратным тестером

Добавлено через 2 минуты
ClearCommError так же в случае ошибки должен выдать CE_RXPARITY
0
nzt
0 / 0 / 0
Регистрация: 26.09.2015
Сообщений: 22
09.10.2017, 13:05  [ТС] #9
vxg,
хм.
C++
1
2
3
COMSTAT ComState;   
DWORD temp = CE_RXPARITY;
bool b( ClearCommError(m_hFile, &temp , &ComState));
Верно ведь описал? Если ошибка - то b == 0?
Хотя нашел другую версию, где проверка идет по изменению temp - тип онпринимает код ошибки. И если все хорошо, то останется 0. Суть в том что после этой функции - темп стал нулем.

А, кстати об имитации - на другом конце виртуального компорта висит программа которая возвращает посылку, но у нее настройки порта отличаются в типе четности. Т.е. посылка посланная с режимом четности EVEN должна вернуться с пометкой ODD, и это есть ошибка.
Однако почему то ошибки нет. Сейчас еще раз перепроверю, но первые тесты неутешительные.

Добавлено через 28 минут
Оккей, перейдем к коду
Вот функция настройки ком порта - в нее пересылается номер порта (port) и скорость (baud)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
CString COM_string2;
COM_string2.GetBuffer(20);
COM_string2.ReleaseBuffer();
COM_string2.Format(_T("\\\\.\\COM%d"), port);
 
m_hFile = CreateFile(COM_string2, GENERIC_READ|GENERIC_WRITE, 0, NULL,                      
   OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL);
 
if(m_hFile == INVALID_HANDLE_VALUE)
{               
    return false;
}
 
DCB dcb;
GetCommState(m_hFile, &dcb);
 
COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout         = MAXDWORD;
CommTimeOuts.ReadTotalTimeoutMultiplier  = 0;
CommTimeOuts.ReadTotalTimeoutConstant    = 0;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant   = 1000;
 
SetCommTimeouts(m_hFile, &CommTimeOuts);
 
dcb.ByteSize = 8;          
dcb.fParity = TRUE;
dcb.fAbortOnError = true;
dcb.Parity   = EVENPARITY ;        
dcb.StopBits = ONESTOPBIT ;    
dcb.BaudRate = baud;
 
bool b(SetCommState(m_hFile, &dcb));
(Надо бы под код убрать под кат, ноя не знаю как тут это делать)

dcb.Parity = EVENPARITY ; - в одной программе ставлю так, в другой ODDPARITY.
Код из предыдущего сообщения стоит в функции чтения.
0
vxg
Модератор
3184 / 1987 / 227
Регистрация: 13.01.2012
Сообщений: 7,678
09.10.2017, 15:25 #10
nzt, ClearComnState возвращает ошибки/статус и очищает ошибки - ошибка если она была будет возвращена в одном из битов temp. То что у вас на разных устройствах установлен разный режим контроля чётности наверное должно приводить к ошибке но если у вас специфичные данные то может и не приведёт

Добавлено через 1 минуту
Если очистка идёт перед чтением то чтение будет всегда ок.

Добавлено через 31 секунду
...в 99%
0
nzt
0 / 0 / 0
Регистрация: 26.09.2015
Сообщений: 22
09.10.2017, 15:46  [ТС] #11
vxg, очистка?
Передаются байты заполненные на все 8 бит, по 4 штуки. И это запросы, а не "потоковое видео".
0
vxg
Модератор
3184 / 1987 / 227
Регистрация: 13.01.2012
Сообщений: 7,678
09.10.2017, 15:59 #12
nzt, очистка = ClearCommState
0
nzt
0 / 0 / 0
Регистрация: 26.09.2015
Сообщений: 22
09.10.2017, 16:24  [ТС] #13
vxg, нэ, в таком случае очистка - после...
C++
1
2
3
4
5
6
7
8
DWORD dwBytesRead = 0;  
if(!ReadFile(m_hFile, buff, szBuff, &dwBytesRead, NULL))
    dwBytesRead = -1;
 
COMSTAT ComState;   
DWORD temp = CE_RXPARITY;
bool b( ClearCommError(m_hFile, &temp , &ComState));
DWORD x( GetLastError());
Добавлено через 3 минуты
Хм. Ладно, еще есть варианты получать значение этого бита? На ассемблере может? Я понимаю что с++ через него и работает, но... я уже утомился за несколько дней от этой проблемы, и готов демонов вызывать.
0
vxg
Модератор
3184 / 1987 / 227
Регистрация: 13.01.2012
Сообщений: 7,678
09.10.2017, 19:02 #14
nzt, то есть настройка порта на проверку чётности у вас пропускает ошибки чётности?

Добавлено через 50 минут
nzt, Кстати
1) вы очень чудно манипулируете функцией ClearCommState - не нужно подавать в неё бит ошибки - нужно проверять что а) функция отработала (вернула TRUE) б) в возвращенной ей ошибке есть ваш бит
2) после вызова функции записи настроек вызовите функцию чтения настроек и убедитесь что контроль чётности реально включился - может ему что-то мешает (права админа например)
0
nzt
0 / 0 / 0
Регистрация: 26.09.2015
Сообщений: 22
11.10.2017, 19:32  [ТС] #15
vxg, Извиняюсь за отсутствие.
1)Так, проверить смогу уже завтра. Попробую ваш вариант ClearCommState.
2) Вы говорите про GetCommState? Хм. я в первой записи указывал на пост, который подтвердился и у меня - проверка после записи отоброжает fparity как false. Я не пробовал настраивать права админа, и испытаю завтра, но пока что результаты пока такие. Хм. И как мне менять права админа? На откомпилирумом приложении поставить галочку " запускать от имени админа"?
0
11.10.2017, 19:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.10.2017, 19:32
Привет! Вот еще темы с ответами:

комп 32 бита потянет видюху 64 бита? - Видеокарты
комп 32 бита потянет видюху 64 бита?

как взять значение определенного бита из байта? и как организовать такое в цикля для каждого бита? - Assembler
FASM моя первая задача - вычислить n-e число фибоначчи бинарное возведение в степень допустим у меня T= 10101010 b мне надо...

Создать 2 переменные, одна из которых хранит 2 старших бита исходного числа, другая 2 младших бита этого числа - C++
Дано число. Создать 2 переменные, одна из которых хранит 2 старших бита исходного числа, другая 2 младших бита этого числа. код частично...

Установка двух ОС - 64 бита и 32 бита - Windows 7
У меня два вопроса: 1) Купил ноутбук с установленной 64 бит Win7. Однако появилась необходимость установить ряд программ которые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru