0 / 0 / 0
Регистрация: 26.09.2015
Сообщений: 25
1

Чтение бита четности

06.10.2017, 10:13. Показов 2872. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.10.2017, 10:13
Ответы с готовыми решениями:

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

Чтение бита из байта
Написал для проверки простой метод определения конкретного бита из байта. В качестве байта число...

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

Чтение цвета бита на canvas
Добрый день! Перед выводом на канвас (WPF) графических объектов необходимо проанализировать цвет...

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

Добавлено через 2 минуты
ClearCommError так же в случае ошибки должен выдать CE_RXPARITY
0
0 / 0 / 0
Регистрация: 26.09.2015
Сообщений: 25
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
Модератор
3377 / 2149 / 352
Регистрация: 13.01.2012
Сообщений: 8,351
09.10.2017, 15:25 10
nzt, ClearComnState возвращает ошибки/статус и очищает ошибки - ошибка если она была будет возвращена в одном из битов temp. То что у вас на разных устройствах установлен разный режим контроля чётности наверное должно приводить к ошибке но если у вас специфичные данные то может и не приведёт

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

Добавлено через 31 секунду
...в 99%
0
0 / 0 / 0
Регистрация: 26.09.2015
Сообщений: 25
09.10.2017, 15:46  [ТС] 11
vxg, очистка?
Передаются байты заполненные на все 8 бит, по 4 штуки. И это запросы, а не "потоковое видео".
0
Модератор
3377 / 2149 / 352
Регистрация: 13.01.2012
Сообщений: 8,351
09.10.2017, 15:59 12
nzt, очистка = ClearCommState
0
0 / 0 / 0
Регистрация: 26.09.2015
Сообщений: 25
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
Модератор
3377 / 2149 / 352
Регистрация: 13.01.2012
Сообщений: 8,351
09.10.2017, 19:02 14
nzt, то есть настройка порта на проверку чётности у вас пропускает ошибки чётности?

Добавлено через 50 минут
nzt, Кстати
1) вы очень чудно манипулируете функцией ClearCommState - не нужно подавать в неё бит ошибки - нужно проверять что а) функция отработала (вернула TRUE) б) в возвращенной ей ошибке есть ваш бит
2) после вызова функции записи настроек вызовите функцию чтения настроек и убедитесь что контроль чётности реально включился - может ему что-то мешает (права админа например)
0
0 / 0 / 0
Регистрация: 26.09.2015
Сообщений: 25
11.10.2017, 19:32  [ТС] 15
vxg, Извиняюсь за отсутствие.
1)Так, проверить смогу уже завтра. Попробую ваш вариант ClearCommState.
2) Вы говорите про GetCommState? Хм. я в первой записи указывал на пост, который подтвердился и у меня - проверка после записи отоброжает fparity как false. Я не пробовал настраивать права админа, и испытаю завтра, но пока что результаты пока такие. Хм. И как мне менять права админа? На откомпилирумом приложении поставить галочку " запускать от имени админа"?
0
Модератор
3377 / 2149 / 352
Регистрация: 13.01.2012
Сообщений: 8,351
12.10.2017, 06:21 16
nzt, хм.. вы правы, четность у меня тоже не назначается ни при запуске от имени администратора ни просто так. попробуйте установить ее в параметрах порта из диспетчера устройств - если вы не назначаете настройки порта в программе, то порт по идее будет открываться с системными настройками - может хоть их он применит
0
0 / 0 / 0
Регистрация: 26.09.2015
Сообщений: 25
12.10.2017, 11:51  [ТС] 17
vxg, Я изменил ClearCommError по вашему совету, и один фиг - возвращает тру, и GetLastError возвращает 0. Ставил галочки на "запускать от имени администратора" у обоих приложений, и сам вижуал студио в придачу так же установил. Не помогло. хм..
Проверил на эмуляторах com0com, и VSPE. Второй не отображается в диспетчере устройств(или я плохо смотрел), а первый отображается, но у создаваемых устройств настроек нет. Попробую найти компьютер с физически существующим портом и посмотреть на нем наличие настройки.

Добавлено через 18 минут
Нашел, настройка есть. Хм. но ведь это не дело, что бы пользователь открывал диспетчер устройств и сам настраивал оборудование.. Кажется я встречал материал где вызывалось стандартное окошко настройки порта.. Попробую его найти.

Добавлено через 1 час 19 минут
Вот тут обнаружил множество настроек и объяснений, среди которых был тот самый вызов стандартного окна настройки порта. Раз уж, я не могу получить к нему доступ через диспетчер устройств.. Вот этой функцией вызывается сеё чудо...
C++
1
2
3
4
5
BOOL CommConfigDialog(
      LPTSTR       lpszName,
      HWND         hWnd,
      LPCOMMCONFIG lpCC
);
И он показывает тоже самое - что настройки вроде как стоят, чет и нечет в зависимости от настроек.. Но ошибок все равно не видит.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.10.2017, 11:51
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru