44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
1

Qt serial port кассовый аппарат

09.04.2016, 00:42. Показов 1452. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Хочу реализовать обмен с кассовым аппаратом, протокол есть в открытом доступе. Так же есть исходники библиотеки для другого аппарата, но от них помощи немного так как там С и по моему мнению сделано плохо.Какое то время я только собирал информацию по этой теме, потому что она для меня новая.
Компьютер посылает команду кассовому аппарату. С аппарата приходит ответ. Компьютер должен посмотреть этот ответ и совершать дальнейшие действия исходя из этого ответа. Как лучше всего это реализовать. Данные скорей всего не приходят мгновенно, поэтому сигнал readyRead будет срабатывать несколько раз. Кто что может посоветовать а я пока буду пытаться сам.
В принципе мог обойтись без всей этой возни если бы остановился на виндосе потому что есть готовый COM объект с которым намного проще, но хочется сделать под линукс.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.04.2016, 00:42
Ответы с готовыми решениями:

QT serial port
Здравствуйте! пытаюсь заставить работать ком порт в QT для начала решил попробовать простой...

Serial Port на Android
Приветствую всех. Написал тестовое приложение, показывающее, сколько COM портов есть в системе и их...

Qt, Android and Serial Port
Всем добрый день или вечер, а может и ночь. Пытаюсь научить дружить планшет с программой на Qt и...

Qt Serial Port отправляет только 3 байта
на компе два порта подсоединены к друг другу . на один ком-порт привязываю свою программу, на...

15
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
09.04.2016, 10:15 2
Вопрос-то в чем?
0
68 / 68 / 17
Регистрация: 20.01.2015
Сообщений: 347
09.04.2016, 10:21 3
RazrFalcon, Как лучше всего это реализовать.

kolts, начать с азов. Прочитать как работает QSerialPort, например. Ну а потом взять и все быстро реализовать.
0
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
09.04.2016, 10:42 4
Цитата Сообщение от Amok Посмотреть сообщение
Как лучше всего это реализовать.
У ТС каша в голове. Для начала стоит задачи обозначить.
0
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
09.04.2016, 12:13  [ТС] 5
Все что касается компорта я знаю. Там настраивается все просто. Жду только общих советов по работе с кассовым аппаратом если кто работал
0
7786 / 6554 / 2983
Регистрация: 14.04.2014
Сообщений: 28,628
09.04.2016, 14:00 6
У тебя же есть описание протокола.
0
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
09.04.2016, 15:26  [ТС] 7
У меня в голове перемешались hex ascii char и bytearray .
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
    QByteArray data;
    data.append(0x02); STX
    data.append(0x5F); //код команды
    data.append("0000",5); //задаю с нулевым символом так как он является разделителем
    data.append("1",2);
    data.append("04",3);
    data.append("00",3);
    data.append("14",2); //контрольная сумма
    data.append(0x03); ETX
    port->write(data);
Загвоздка в вычислении контрольной суммы.
Контрольная сумма вычисляется сложением без переноса
всех байтов посылки, без учета байта STX и представляет собой 1-байтовое число,
передаваемое в формате битового поля. Но передается она в формате ascii. То есть у меня должно получиться 14 но передаю я его не как 0х14, а "14".
Как мне в данном случае получить 14 (который я получил с помощью прослушки порта).
0
7786 / 6554 / 2983
Регистрация: 14.04.2014
Сообщений: 28,628
09.04.2016, 15:53 8
Как 14-то получается? Что значит сложить без переноса?
0
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
09.04.2016, 16:10  [ТС] 9
Сам не знаю так в книжке написано. Еще вот добавлено
Битовое (шестнадцатеричное) поле представляет собой набор пар символов, которые
передают один байт в ASCII представлении. Допустимыми символами для этого поля
являются «0» ... «9» (ASCII 30H ... 39H), «A» ... «F» (ASCII 41H ... 46H), «a» ... «f»
(ASCII 61H ... 66H). Длина поля различается в зависимости от конкретного применения.
Пример: 27 - «1B»
Это тоже относится к контрольной сумме.
http://www.remkas.ru/files/M1141RukProg_v3.pdf Вот описание протокола.
Оказалось что моему аппарату этот протокол не подходит, коды команд, по крайней мере некоторых, отличаются. Но я надеюсь контрольная сумма считается одинаково.
0
7786 / 6554 / 2983
Регистрация: 14.04.2014
Сообщений: 28,628
09.04.2016, 18:00 10
Там точно 14? Вот здесь описано какое-то сложение без переноса для работы с устройством: http://www.linux.org.ru/forum/development/1427250
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
#define SUMHB(a, b) (((a) + (b)) & 0x0F)
#define SUM_B(a, b) ((SUMHB((a) >> 4, (b) >> 4) << 4) | \
                     SUMHB((a), (b)))
 
int main(int argc, char **argv) {
  unsigned char a = 0xAF;
  unsigned char b = 0x13;
 
  unsigned char c = SUM_B(a, b);
 
  printf("c = %2.2x\n", c);
 
  return(0);
}
0
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
09.04.2016, 21:28  [ТС] 11
Тоже гуглил это, но походу здесь так
0x5f + //код команды
0x30 + 0x30 + 0x30 + 0x30 //(это "0000")
+ 0x00 //нуль терминатор - разделитель полей
+ 0x30 + 0x34 // "04" данные
+ 0x00
+ 0x30 + 0x30 //"00" данные
+ 0x00 = 214; //сумма
Отбрасываем 2, так как нужен 1 байт и получаем 14. Буду посмотреть что получится дальше. Объяснено в описании конечно...
0
7786 / 6554 / 2983
Регистрация: 14.04.2014
Сообщений: 28,628
09.04.2016, 21:54 12
А где единица после четырёх нулей? У тебя же она в том сообщении есть.
0
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
09.04.2016, 22:38  [ТС] 13
Пропустил, но уже в цикле проверил получается 214. Все вроде правильно, не думаю что это совпадение
C++ (Qt)
1
2
3
4
5
 QByteArray ba("_000010400"); // Мой массив данных, по которому должна считаться контрольная сумма, символ '_' это 0x5f
int sum = 0;  
for (int i = 0; i< ba.size();i++)
       sum += ba.at(i);
qDebug()<<QString().setNum(sum,16);
Получается 214.
0
7786 / 6554 / 2983
Регистрация: 14.04.2014
Сообщений: 28,628
09.04.2016, 23:01 14
Ну хорошо тогда. Только char для суммы, а не int.
0
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,964
10.04.2016, 07:50 15
Со сложением без переноса у меня получилось 4, с просто сложением - 0x14(0x214).
0
68 / 68 / 17
Регистрация: 20.01.2015
Сообщений: 347
11.04.2016, 19:48 16
C++ (Qt)
1
QByteArray data("\x2\x5f")
Вместо кучи append.
1
11.04.2016, 19:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.04.2016, 19:48
Помогаю со студенческими работами здесь

Сборка Qt Serial Port под Android из source
Добрый день помогите пожалуйтса собарть комплект Serial port под android, скачал сорцы, выставил...

Как передать значение из формы на кассовый аппарат?
кассовый аппарат как нажатием кнопки передать значение из формы на кассовый аппарат и...

Работа Scilab Serial Port Library (COM port)
Как работает Scilab Serial Port Library ? (может кто то встречал описание подробное, поделитесь...

serial port
Здравствуйте. Использую стандартные классы .net для работы с ком портом. Работу с портом...


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

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

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