Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / COM порт / 25 сообщений из 28, страница 1 из 2
08.07.2018, 19:48
    #39671300
Oleg_SPB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
Здравствуйте.
Нужно на Дельфи сделать модуль для работы с ККТ (касса) по СОМ порту. Вроде все сделал, посылаю команды, получаю ответы.
Но вот возник вопрос: как мне узнать что ККТ записал весь ответ?
Я делаю WriteFile(Handle...), потом ReadFile(Handle...). Иногда случается, что считывается не вся информация. Т.е. ощущение, что я читать начинаю раньше чем получен полный ответ.
...
Рейтинг: 0 / 0
08.07.2018, 20:12
    #39671301
MBo
MBo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
Прочитать всё, что пришло, и добавить к буферу
Проверить, что в буфере собралась полная посылка - протокол обмена обычно подразумевает наличие символов-терминаторов, например CR, LF (символы #13, #10)


Обычно лучше использовать асинхронный режим - по событию прихода данных EV_RXCHAR
...
Рейтинг: 0 / 0
09.07.2018, 09:58
    #39671418
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
MBoпротокол обмена обычно подразумевает наличие символов-терминаторов, например CR, LF (символы #13, #10)
Я больше сталкивался с символами STX/ENQ ($02/$05)
...
Рейтинг: 0 / 0
09.07.2018, 10:44
    #39671477
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
Cobalt747MBoпротокол обмена обычно подразумевает наличие символов-терминаторов, например CR, LF (символы #13, #10)
Я больше сталкивался с символами STX/ENQ ($02/$05)Какая разница. Без протокола на руках, в котором всё описано, все равно без толку что-то начинать.
А если он есть - зачем гадать.
...
Рейтинг: 0 / 0
09.07.2018, 11:31
    #39671505
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
Писать самому с нуля - идиотство.Там целый космос логики.

Всегда к ККМ идет библиотечка для работы с конкретным аппаратом.
Для штатной работы кассы ее достаточно.

А еще есть такие универсальные OLE-драйверы OPOS. Не очень представляю, как эта универсальность достигается, но видел своими глазами, как они работают. Возможно сам конкретный аппарат поддерживает этот протокол, т.е. вероятно не все модели так умеют.
...
Рейтинг: 0 / 0
09.07.2018, 12:42
    #39671555
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
L_argoВсегда к ККМ идет библиотечка для работы с конкретным аппаратом.
Для штатной работы кассы ее достаточно.Далеко не всегда :)
...
Рейтинг: 0 / 0
09.07.2018, 15:31
    #39671665
Oleg_SPB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
Запись в ККТ (СОМ) -> ККТ переваривает -> Запись ответа ККТ (СОМ) -> Чтение ответа (СОМ)

Если я начинаю читать раньше чем ККТ запишет/переварит, то у меня либо пусто, либо не полно. Дальнейшее чтение ни к чему не приводит. Т.е. буфер не наполняется более.
Как я понял, если я начал читать, то ККТ туда уже ничего не запишет. Или я не прав?
Если прав, то как понять когда можно читать?
...
Рейтинг: 0 / 0
09.07.2018, 15:32
    #39671666
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
Oleg_SPBЗапись в ККТ (СОМ) -> ККТ переваривает -> Запись ответа ККТ (СОМ) -> Чтение ответа (СОМ)

Если я начинаю читать раньше чем ККТ запишет/переварит, то у меня либо пусто, либо не полно. Дальнейшее чтение ни к чему не приводит. Т.е. буфер не наполняется более.
Как я понял, если я начал читать, то ККТ туда уже ничего не запишет. Или я не прав?
Если прав, то как понять когда можно читать?
открой протокол обмена для своего аппарата,
там должно быть всё детально расписано
...
Рейтинг: 0 / 0
09.07.2018, 15:41
    #39671668
Oleg_SPB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
defecator,

По СОМ порту там одна фраза:

для передачи используется протокол связи со скоростью обмена 115200 бод с физическим кадром: 1 стартовый бит, 8 бит данных,1 стоп-бит, без проверки на четность;
...
Рейтинг: 0 / 0
09.07.2018, 15:42
    #39671669
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
Oleg_SPBdefecator,

По СОМ порту там одна фраза:

для передачи используется протокол связи со скоростью обмена 115200 бод с физическим кадром: 1 стартовый бит, 8 бит данных,1 стоп-бит, без проверки на четность;
значит, ищи в интернетах протокол обмена.
Что за аппарат хоть ?
...
Рейтинг: 0 / 0
09.07.2018, 15:45
    #39671672
Oleg_Spb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
defecator,

КИТ ОНЛАЙН-Ф
...
Рейтинг: 0 / 0
09.07.2018, 15:48
    #39671674
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
Oleg_SpbКИТ ОНЛАЙН-Ф
я так понимаю, что на родной сайт производителя ты не заходил даже ?
https://kit-invest.ru/Download/Протокол.pdf
...
Рейтинг: 0 / 0
09.07.2018, 16:08
    #39671687
Oleg_SPB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
По TCP протоколу у меня уже все работает (согласно документа)
По СОМ порту вопросы...
Не по ККТ, а именно по СОМ. Не работал я с ним на низком уровне.
Не пойму в какой момент начинать читать ответ! раньше - он не полный, ждать 1-2 сек - не красиво...
...
Рейтинг: 0 / 0
09.07.2018, 16:23
    #39671691
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
Oleg_SPBПо TCP протоколу у меня уже все работает (согласно документа)
По СОМ порту вопросы...
Не по ККТ, а именно по СОМ. Не работал я с ним на низком уровне.
Не пойму в какой момент начинать читать ответ! раньше - он не полный, ждать 1-2 сек - не красиво...

В документе, который я тебе прислал, всё чётко написано.
Страница номер 5 (пять) - как послать данные в порт.
Страница номер 6 (шесть) - как принять данные из порта.

Опрашиваешь последовательный порт, и ждёшь, когда придёт маркер начала данных - $B629
После этого два следующих байт - длина блока данных.
Вот и читаешь из порта всё, что придёт, в буфер.
Как принял кол-во байт, соответствующее длине сообщения, вычисляешь CRC принятых данных,
сравниваешь с принятым.
Если всё хорошо, разбираешь принятый пакет в соответствии с описанием протокола.
...
Рейтинг: 0 / 0
09.07.2018, 16:54
    #39671715
Oleg_Spb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
defecator,

блин :)

Код: pascal
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.
...
WriteFile(ComHndl, Transmit, i + 1, BytesWritten, @FOvr);

Sleep(50 + BytesWritten * 2); //немножко ждем, пока ККТ переварит команду (дополнительно увеличиваем время для ответа в зависимости от длины команды)

ClearCommError(ComHndl, fErrs, @fStat);
fCount := fStat.cbInQue;

While True do
    begin
      ReadFile(ComHndl, fByte, 1, BytesRead, @FOvr);
      inc(j);
      if BytesRead <> 0 then
        begin
          if i > 1 then
            begin
              fPrevByte := fBuffer[i - 1];
              fCurrentByte := fByte;
            end;
          Recive[i] := fByte;
          fBuffer[i] := fByte;
          Inc(i);
          if (fPrevByte = Lo(TFunc.crc16(Copy(fBuffer, 2, i - 4), $1021, $FFFF))) And (fCurrentByte = Hi(TFunc.crc16(Copy(fBuffer, 2, i - 4), $1021, $FFFF))) then
            Break;
        end;
    end;
...



Вопрос - команда SLEEP мне нужна? Или можно как-то событие повесить на СОМ? Если я убираю SLEEP, то ReadFile либо ни чего не считывает, либо считывает только малую часть ответа и на этом все...
Если SLEEP поставить 1000, то все работает
...
Рейтинг: 0 / 0
09.07.2018, 16:56
    #39671718
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
Oleg_Spb,

зачем изобретать велосипед ?
возьми готовые компоненты для работы с последовательным портом.
Например 21551774
...
Рейтинг: 0 / 0
09.07.2018, 17:15
    #39671726
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
Oleg_SPBНе пойму в какой момент начинать читать ответ!
Читать ответ нужно начинать сразу же после того, как отправил запрос. Без всяких слипов.
И читать до тех пор, пока:
1. Либо не получен корректный ответ, соответствующий протоколу;
2. Либо не истек таймаут ожидания ответа.

По TCP - та же логика. Если у тебя работало - значит везло просто.
...
Рейтинг: 0 / 0
09.07.2018, 17:16
    #39671729
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
3. Либо не пришел какой-то бред, явно не по протоколу (неверное начало ответа).
...
Рейтинг: 0 / 0
09.07.2018, 17:16
    #39671730
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
YuRockL_argoВсегда к ККМ идет библиотечка для работы с конкретным аппаратом.
Для штатной работы кассы ее достаточно.Далеко не всегда :)Те ККМ, которые есть в гос.реестре всегда имеют дистрибьюторов, у кот. всегда есть необходимый софт.
Какой смысл продавать ККМ без софта ????? Это нереально. Никто в здравом уме не купит.
А "левые" модели ККМ использовать стрёмно, т.к. нет софта, гарантии, поддержки, ремонта и т.д.

И вообще обязательно взгреют за левизну в налоговой...

зы: хотя конеш могут быть нюансы: дров может не быть под линукс/эппл. Тогда пусть страдают. :)
А написать полноценный драйвер на незнакомую ККМ, это эпичная жесть...
...
Рейтинг: 0 / 0
09.07.2018, 17:20
    #39671733
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
L_argoТе ККМ, которые есть в гос.реестре всегда имеют дистрибьюторов, у кот. всегда есть необходимый софт.
Да, бывает - что только у них.
L_argoКакой смысл продавать ККМ без софта ?????
Чтобы монополизировать рынок "дистрибьюторов".
Хотите поддержать? Пожалуйста, вот вам протокол, разбирайтесь, а мы потом посмотрим и напишем лицензию на софт, если захотим.

Это не простой рынок. Во всяком случае, в Украине. У меня программа, например, поддерживает все кассы, кроме одной. У неё "секретный" протокол и они его не дают. Даже протокол. Никому. Ну, кроме налоговой, при прохождении сертификации.
...
Рейтинг: 0 / 0
09.07.2018, 17:22
    #39671734
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
L_argoА написать полноценный драйвер на незнакомую ККМ, это эпичная жесть...Это обычная жизнь
Когда я поддерживал некоторые кассы, никаких драйверов ни в каком виде для них еще не было, от слова совсем. Я брал и писал. Никакой жести не видел.
...
Рейтинг: 0 / 0
09.07.2018, 17:23
    #39671735
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
Сейчас-то да, появились (для половины примерно).
...
Рейтинг: 0 / 0
09.07.2018, 18:22
    #39671765
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
Oleg_Spbdefecator,

блин :)

Код: pascal
1.
2.
3.
4.
5.
6.
...
  While True do
    begin
      ReadFile(ComHndl, fByte, 1, BytesRead, @FOvr);
      inc(j);
...




Вопрос - команда SLEEP мне нужна? Или можно как-то событие повесить на СОМ? Если я убираю SLEEP, то ReadFile либо ни чего не считывает, либо считывает только малую часть ответа и на этом все...
Если SLEEP поставить 1000, то все работает
Вы код откуда-то позаимствовали? Есть параметр @FOvr, который используется при асинхронном чтении, но код написан так, как для синхронного.
Чтобы функция ReadFile ждала некоторое время, прежде, чем возвратить результат, нужно задать соответствующие таймауты для порта. См. фунцию SetCommTimeouts .
...
Рейтинг: 0 / 0
09.07.2018, 18:34
    #39671773
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
s62,
например вот так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
var   Timeouts: TCommTimeouts;

...
...
//после открытия порта, перед началом обмена данными
    GetCommTimeouts(ComHndl, Timeouts);
    with Timeouts do
    begin
      ReadIntervalTimeout := 0;
      ReadTotalTimeoutMultiplier := 0;
      ReadTotalTimeoutConstant := 100;
      WriteTotalTimeoutMultiplier := 0;
      WriteTotalTimeoutConstant := 100;
    end;
    if  not SetCommTimeouts(ComHndl, Timeouts)
    then Raise EPortException.Create('SetTimeouts error!');


Если задать таймауты так, то ReadFile возвратит результат или тогда, когда прочитает заданное количество байтов, или, если байты не пришли, то через 100 мс. Таймауты для записи особой роли не играют, как я понимаю, т.к. обычно по-моему в порт всё пишется без задержек.
...
Рейтинг: 0 / 0
09.07.2018, 19:34
    #39671792
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM порт
s62т.к. обычно по-моему в порт всё пишется без задержек.
Если только не используется CTS например и т.п. )
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / COM порт / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]