Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
102 / 102 / 13
Регистрация: 22.10.2011
Сообщений: 328

Расчет контрольной суммы для bluetooth ККМ CMP-10

22.10.2011, 08:41. Показов 4540. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Коллеги,

помогите пожалуйста с расчетом контрольной суммы ККМ CMP-10

Дословно:
контрольная сумма – это два младших байта суммы байтов сообщения
(суммированию подлежит часть сообщения, начиная с первого байта за преамбулой
( SOH ) вплоть до постамбулы (ENQ), включая ее).
Диапазон значений: 0000h-FFFFh.
длина: 4 байта
каждая цифра контрольной суммы передается в виде символа, код которого
равен значению цифры плюс 30h.
Например, сумма 1AE3h передается как последовательность символов с кодами
31h, 3Ah, 3Eh, 33h.
Ума не приложу, как именно сделать, уже были попытки, но они ни к чему не привели
Есть также вопросы по поводу "суммирования подлежит части сообщения" - это как? Перевести все байты в INT а потом + + + + ..., так что ли?...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.10.2011, 08:41
Ответы с готовыми решениями:

Расчет контрольной суммы файла
Доброго времени, форумчане. Подскажите, пожалуйста, примеры расчета контрольной суммы файла. Возникла необходимость расчета контрольной...

Расчет контрольной суммы
Правильно ли я понимаю задание? Настройки com порта стандартные: 9600, 1 стартовый бит, 8 бит данных, 1 стоповый бит, без бита...

Код по алгоритму. Расчет контрольной суммы
Помогите написать код по этому алгоритму. 1) Пользователь может выбрать ввод 8-ми или на 13-ти чисел.(вводит их сам) 2) Сложить...

24
102 / 102 / 13
Регистрация: 22.10.2011
Сообщений: 328
24.10.2011, 18:05  [ТС]
Студворк — интернет-сервис помощи студентам
Я сделал как ты написал для всех статусов (их блин не мало), запустил, в результате на экране появилась просто распечатка всех статусов. Либо я сделал что-то не так, либо выставлены все биты у каждого из шести байтов статуса
А байты у меня такие
  1. 128
  2. 128
  3. 128
  4. 130
  5. 129
  6. 208
Миниатюры
Расчет контрольной суммы для bluetooth ККМ CMP-10  
0
102 / 102 / 13
Регистрация: 22.10.2011
Сообщений: 328
24.10.2011, 18:07  [ТС]
Код который дешифрует статус
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
            List<string> list = new List<string>();
 
            #region byte 0
            Enumerators.StatusByte0 byte0 = (Enumerators.StatusByte0)Status[0];
            if ((byte0 & Enumerators.StatusByte0.InServiceMode) != 0) list.Add("Регистратор находится в сервисном режиме");
            if ((byte0 & Enumerators.StatusByte0.BufferAlmostFull) != 0) list.Add("Буфер документа близок к концу (осталось места на 100 чеков*)");
            if ((byte0 & Enumerators.StatusByte0.DateNotSet) != 0) list.Add("Аппарат в аварийном режиме");
            if ((byte0 & Enumerators.StatusByte0.DisplayNotConnected) != 0) list.Add("Дисплей не подключен");
            if ((byte0 & Enumerators.StatusByte0.FaultState) != 0) list.Add("Механизм печатающего устройства не готов к печати (детали Байт S1)");
            if ((byte0 & Enumerators.StatusByte0.ReloadRequred) != 0) list.Add("Для вступления в силу изменений настроек необходимо перегрузить ЭККР");
            if ((byte0 & Enumerators.StatusByte0.Undefined) != 0) list.Add("Прочие ошибки оборудования");
            if ((byte0 & Enumerators.StatusByte0.None) != 0) list.Add("");
            #endregion  
 
            #region byte 1
            Enumerators.StatusByte1 byte1 = (Enumerators.StatusByte1)Status[1];
            if ((byte1 & Enumerators.StatusByte1.EndsReceiptTape) != 0) list.Add("Заканчивается чековая лента");
            if ((byte1 & Enumerators.StatusByte1.EndsControlTape) != 0) list.Add("Заканчивается контрольная лента");
            if ((byte1 & Enumerators.StatusByte1.EndReceiptTape) != 0) list.Add("Закончилась чековая лента");
            if ((byte1 & Enumerators.StatusByte1.EndControlTape) != 0) list.Add("Закончилась контрольная лента");
            if ((byte1 & Enumerators.StatusByte1.PrinterCoverIsOpen) != 0) list.Add("Открыта крышка принтера");
            if ((byte1 & Enumerators.StatusByte1.PerformedManualPaperFeed) != 0) list.Add("Осуществляется ручная протяжка бумаги");
            if ((byte1 & Enumerators.StatusByte1.PrintBufferIsNotEmpty) != 0) list.Add("Буфер принтера не пуст (есть еще не распечатанные данные)");
            if ((byte1 & Enumerators.StatusByte1.None) != 0) list.Add("");
            #endregion  
 
            #region byte 2
            Enumerators.StatusByte2 byte2 = (Enumerators.StatusByte2)Status[2];
            if ((byte2 & Enumerators.StatusByte2.CurrentStateOfCheck) != 0) list.Add("Текущее состояние чека (см. раздел «Состояние чека»)");
            if ((byte2 & Enumerators.StatusByte2.CurrentStateOfCheck1) != 0) list.Add("Текущее состояние чека (см. раздел «Состояние чека»)");
            if ((byte2 & Enumerators.StatusByte2.CurrentStateOfCheck2) != 0) list.Add("Текущее состояние чека (см. раздел «Состояние чека»)");
            if ((byte2 & Enumerators.StatusByte2.CurrentStateOfCheck3) != 0) list.Add("Текущее состояние чека (см. раздел «Состояние чека»)");
            if ((byte2 & Enumerators.StatusByte2.BackCheck) != 0) list.Add("Установлен в 1 при: 1. Открытом возвратном чеке. 2. При закрытом чеке, если предыдущий документ был возвратным чеком*.");
            if ((byte2 & Enumerators.StatusByte2.Undefined5) != 0) list.Add("Не определено");
            if ((byte2 & Enumerators.StatusByte2.Undefined6) != 0) list.Add("Не определено");
            if ((byte2 & Enumerators.StatusByte2.None) != 0) list.Add("");
            #endregion  
 
            #region byte 3
            Enumerators.StatusByte3 byte3 = (Enumerators.StatusByte3)Status[3];
            if ((byte3 & Enumerators.StatusByte3.SIMError) != 0) list.Add("SIMError");
            if ((byte3 & Enumerators.StatusByte3.MCardError) != 0) list.Add("MCardError");
            if ((byte3 & Enumerators.StatusByte3.Undefined2) != 0) list.Add("Автономный режим работы");
            if ((byte3 & Enumerators.StatusByte3.Undefined3) != 0) list.Add("Не определено");
            if ((byte3 & Enumerators.StatusByte3.Undefined4) != 0) list.Add("Не определено");
            if ((byte3 & Enumerators.StatusByte3.Undefined5) != 0) list.Add("Не определено");
            if ((byte3 & Enumerators.StatusByte3.Undefined6) != 0) list.Add("Не определено");
            if ((byte3 & Enumerators.StatusByte3.None) != 0) list.Add("");
            #endregion  
 
            #region byte 4
            Enumerators.StatusByte4 byte4 = (Enumerators.StatusByte4)Status[4];
            if ((byte4 & Enumerators.StatusByte4.SerialNumberIsProgrammed) != 0) list.Add("Заводской номер запрограммирован");
            if ((byte4 & Enumerators.StatusByte4.RegistrarFiscalizated) != 0) list.Add("Регистратор фискализирован");
            if ((byte4 & Enumerators.StatusByte4.BufferAlmostFull) != 0) list.Add("В ФП места менее чем на 30 отчетов");
            if ((byte4 & Enumerators.StatusByte4.BufferIsFull) != 0) list.Add("Фискальная память переполнена");
            if ((byte4 & Enumerators.StatusByte4.Undefined4) != 0) list.Add("Не определено");
            if ((byte4 & Enumerators.StatusByte4.Undefined5) != 0) list.Add("Не определено");
            if ((byte4 & Enumerators.StatusByte4.MemoryError) != 0) list.Add("Возникла ошибка фискальной памяти");
            if ((byte4 & Enumerators.StatusByte4.None) != 0) list.Add("");
            #endregion  
 
            #region byte 5
            Enumerators.StatusByte5 byte5 = (Enumerators.StatusByte5)Status[5];
            if ((byte5 & Enumerators.StatusByte5.Undefined0) != 0) list.Add("Не определено");
            if ((byte5 & Enumerators.StatusByte5.Undefined1) != 0) list.Add("Не определено");
            if ((byte5 & Enumerators.StatusByte5.LowBattery) != 0) list.Add("Низкий заряд батареи");
            if ((byte5 & Enumerators.StatusByte5.Alert) != 0) list.Add("Сработало оповещение");
            if ((byte5 & Enumerators.StatusByte5.OpenSession) != 0) list.Add("Cмена открыта");
            if ((byte5 & Enumerators.StatusByte5.NeedToFixSystemDateTime) != 0) list.Add("Часы нуждаются в корректировке");
            if ((byte5 & Enumerators.StatusByte5.WordDayAlmostEnd) != 0) list.Add("До конца смены(24часа) осталось меньше 60 минут");
            if ((byte5 & Enumerators.StatusByte5.None) != 0) list.Add("");
            #endregion
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
24.10.2011, 18:13
SNOOPYKZ, ага, мой косячок в сравнениях. Не обратил внимания, что первый бит всегда 1, привык к "нормальным" флагам.

Измените проверку условий.
Было:
C#
1
if ((status & GeneralStatus.BufferAlmostFull) != 0) Console.WriteLine("буфер документа близок к концу (осталось места на 100 чеков*)");
Стало:
C#
1
if ((status & GeneralStatus.BufferAlmostFull) == GeneralStatus.BufferAlmostFull) Console.WriteLine("буфер документа близок к концу (осталось места на 100 чеков*)");
То бишь сравнивайте не с отличием от нуля (при первой единице они всегд будут отличны), а с полным совпадением.

В самих enum'ах (которых, блин, не мало) ничего менять не надо.

Добавлено через 2 минуты
Кстати, не запутаетесь в этих StatusByte0, StatusByte1?
Там же есть конкретные категории статусов - называйте по ним. Потом проще рефакторить будет.
1
102 / 102 / 13
Регистрация: 22.10.2011
Сообщений: 328
24.10.2011, 18:14  [ТС]
Хотя если сделать тупой пример
C#
1
2
            BitArray arr = new BitArray(new byte[] { 128 });
            for (int i = 0; i < 8;i++) Console.WriteLine(String.Format("{0}. {1}", i, arr[i] ? "YES" : "NO"));
То видно, что байти пришли "какие надо", просто декодер статуса работает не верно.
Миниатюры
Расчет контрольной суммы для bluetooth ККМ CMP-10  
0
102 / 102 / 13
Регистрация: 22.10.2011
Сообщений: 328
24.10.2011, 18:38  [ТС]
вроде получилось, выходит ошибка MCardError, буду смотреть почему именно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.10.2011, 18:38

Структура пакета и расчет контрольной суммы для RS485
Стоит задача реализовать структуру (скелет) пакета для обмена по RS485. Master-орм выступает АРМ-пользователя, а Slave-вами некие...

Расчет контрольной суммы файла
Доброе время суток! не когда не работал с контрольными суммами, не подскажите библиотеку или пример кода расчета контрольной суммы...

Расчет контрольной суммы ip заголовка
Всем доброго времени суток. Стоит задача рассчитать контрольную сумму ip заголовка. Пробовал сделать сам, получилось так :...

Расчет контрольной суммы UDP
Пытаюсь связать микроконтроллер с компом по Ethernet'у. Написал ARP протокол, добрался до UDP. Здесь возникли проблемы с контрольной...

Расчет Контрольной суммы CRC части файла
имеем файл OSC_13.nbf первые 42 байта - это заголовок, где описано, для какого устройства, какая версия и какой язык в прошивке. ...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru