Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 COM порт  [new]
Oleg_SPB
Guest
Здравствуйте.
Нужно на Дельфи сделать модуль для работы с ККТ (касса) по СОМ порту. Вроде все сделал, посылаю команды, получаю ответы.
Но вот возник вопрос: как мне узнать что ККТ записал весь ответ?
Я делаю WriteFile(Handle...), потом ReadFile(Handle...). Иногда случается, что считывается не вся информация. Т.е. ощущение, что я читать начинаю раньше чем получен полный ответ.
8 июл 18, 19:48    [21554317]     Ответить | Цитировать Сообщить модератору
 Re: COM порт  [new]
MBo
Member

Откуда:
Сообщений: 40
Прочитать всё, что пришло, и добавить к буферу
Проверить, что в буфере собралась полная посылка - протокол обмена обычно подразумевает наличие символов-терминаторов, например CR, LF (символы #13, #10)


Обычно лучше использовать асинхронный режим - по событию прихода данных EV_RXCHAR
8 июл 18, 20:12    [21554331]     Ответить | Цитировать Сообщить модератору
 Re: COM порт  [new]
Cobalt747
Member

Откуда:
Сообщений: 2018
MBo
протокол обмена обычно подразумевает наличие символов-терминаторов, например CR, LF (символы #13, #10)

Я больше сталкивался с символами STX/ENQ ($02/$05)
9 июл 18, 09:58    [21555136]     Ответить | Цитировать Сообщить модератору
 Re: COM порт  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3528
Cobalt747
MBo
протокол обмена обычно подразумевает наличие символов-терминаторов, например CR, LF (символы #13, #10)

Я больше сталкивался с символами STX/ENQ ($02/$05)
Какая разница. Без протокола на руках, в котором всё описано, все равно без толку что-то начинать.
А если он есть - зачем гадать.
9 июл 18, 10:44    [21555305]     Ответить | Цитировать Сообщить модератору
 Re: COM порт  [new]
L_argo
Member

Откуда:
Сообщений: 295
Писать самому с нуля - идиотство.Там целый космос логики.

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

А еще есть такие универсальные OLE-драйверы OPOS. Не очень представляю, как эта универсальность достигается, но видел своими глазами, как они работают. Возможно сам конкретный аппарат поддерживает этот протокол, т.е. вероятно не все модели так умеют.
9 июл 18, 11:31    [21555473]     Ответить | Цитировать Сообщить модератору
 Re: COM порт  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3528
L_argo
Всегда к ККМ идет библиотечка для работы с конкретным аппаратом.
Для штатной работы кассы ее достаточно.
Далеко не всегда :)
9 июл 18, 12:42    [21555810]     Ответить | Цитировать Сообщить модератору
 Re: COM порт  [new]
Oleg_SPB
Guest
Запись в ККТ (СОМ) -> ККТ переваривает -> Запись ответа ККТ (СОМ) -> Чтение ответа (СОМ)

Если я начинаю читать раньше чем ККТ запишет/переварит, то у меня либо пусто, либо не полно. Дальнейшее чтение ни к чему не приводит. Т.е. буфер не наполняется более.
Как я понял, если я начал читать, то ККТ туда уже ничего не запишет. Или я не прав?
Если прав, то как понять когда можно читать?
9 июл 18, 15:31    [21556634]     Ответить | Цитировать Сообщить модератору
 Re: COM порт  [new]
defecator
Member

Откуда:
Сообщений: 38597
Oleg_SPB
Запись в ККТ (СОМ) -> ККТ переваривает -> Запись ответа ККТ (СОМ) -> Чтение ответа (СОМ)

Если я начинаю читать раньше чем ККТ запишет/переварит, то у меня либо пусто, либо не полно. Дальнейшее чтение ни к чему не приводит. Т.е. буфер не наполняется более.
Как я понял, если я начал читать, то ККТ туда уже ничего не запишет. Или я не прав?
Если прав, то как понять когда можно читать?

открой протокол обмена для своего аппарата,
там должно быть всё детально расписано
9 июл 18, 15:32    [21556641]     Ответить | Цитировать Сообщить модератору
 Re: COM порт  [new]
Oleg_SPB
Guest
defecator,

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

для передачи используется протокол связи со скоростью обмена 115200 бод с физическим кадром: 1 стартовый бит, 8 бит данных,1 стоп-бит, без проверки на четность;
9 июл 18, 15:41    [21556668]     Ответить | Цитировать Сообщить модератору
 Re: COM порт  [new]
defecator
Member

Откуда:
Сообщений: 38597
Oleg_SPB
defecator,

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

для передачи используется протокол связи со скоростью обмена 115200 бод с физическим кадром: 1 стартовый бит, 8 бит данных,1 стоп-бит, без проверки на четность;

значит, ищи в интернетах протокол обмена.
Что за аппарат хоть ?
9 июл 18, 15:42    [21556677]     Ответить | Цитировать Сообщить модератору
 Re: COM порт  [new]
Oleg_Spb
Guest
defecator,

КИТ ОНЛАЙН-Ф
9 июл 18, 15:45    [21556688]     Ответить | Цитировать Сообщить модератору
 Re: COM порт  [new]
defecator
Member

Откуда:
Сообщений: 38597
Oleg_Spb
КИТ ОНЛАЙН-Ф

я так понимаю, что на родной сайт производителя ты не заходил даже ?
https://kit-invest.ru/Download/Протокол.pdf
9 июл 18, 15:48    [21556700]     Ответить | Цитировать Сообщить модератору
 Re: COM порт  [new]
Oleg_SPB
Guest
По TCP протоколу у меня уже все работает (согласно документа)
По СОМ порту вопросы...
Не по ККТ, а именно по СОМ. Не работал я с ним на низком уровне.
Не пойму в какой момент начинать читать ответ! раньше - он не полный, ждать 1-2 сек - не красиво...
9 июл 18, 16:08    [21556784]     Ответить | Цитировать Сообщить модератору
 Re: COM порт  [new]
defecator
Member

Откуда:
Сообщений: 38597
Oleg_SPB
По TCP протоколу у меня уже все работает (согласно документа)
По СОМ порту вопросы...
Не по ККТ, а именно по СОМ. Не работал я с ним на низком уровне.
Не пойму в какой момент начинать читать ответ! раньше - он не полный, ждать 1-2 сек - не красиво...


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

Опрашиваешь последовательный порт, и ждёшь, когда придёт маркер начала данных - $B629
После этого два следующих байт - длина блока данных.
Вот и читаешь из порта всё, что придёт, в буфер.
Как принял кол-во байт, соответствующее длине сообщения, вычисляешь CRC принятых данных,
сравниваешь с принятым.
Если всё хорошо, разбираешь принятый пакет в соответствии с описанием протокола.
9 июл 18, 16:23    [21556837]     Ответить | Цитировать Сообщить модератору
 Re: COM порт  [new]
Oleg_Spb
Guest
defecator,

блин :)

...
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, то все работает
9 июл 18, 16:54    [21556967]     Ответить | Цитировать Сообщить модератору
 Re: COM порт  [new]
defecator
Member

Откуда:
Сообщений: 38597
Oleg_Spb,

зачем изобретать велосипед ?
возьми готовые компоненты для работы с последовательным портом.
Например 21551774
9 июл 18, 16:56    [21556978]     Ответить | Цитировать Сообщить модератору
 Re: COM порт  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3528
Oleg_SPB
Не пойму в какой момент начинать читать ответ!

Читать ответ нужно начинать сразу же после того, как отправил запрос. Без всяких слипов.
И читать до тех пор, пока:
1. Либо не получен корректный ответ, соответствующий протоколу;
2. Либо не истек таймаут ожидания ответа.

По TCP - та же логика. Если у тебя работало - значит везло просто.
9 июл 18, 17:15    [21557054]     Ответить | Цитировать Сообщить модератору
 Re: COM порт  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3528
3. Либо не пришел какой-то бред, явно не по протоколу (неверное начало ответа).
9 июл 18, 17:16    [21557057]     Ответить | Цитировать Сообщить модератору
 Re: COM порт  [new]
L_argo
Member

Откуда:
Сообщений: 295
YuRock
L_argo
Всегда к ККМ идет библиотечка для работы с конкретным аппаратом.
Для штатной работы кассы ее достаточно.
Далеко не всегда :)
Те ККМ, которые есть в гос.реестре всегда имеют дистрибьюторов, у кот. всегда есть необходимый софт.
Какой смысл продавать ККМ без софта ????? Это нереально. Никто в здравом уме не купит.
А "левые" модели ККМ использовать стрёмно, т.к. нет софта, гарантии, поддержки, ремонта и т.д.

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

зы: хотя конеш могут быть нюансы: дров может не быть под линукс/эппл. Тогда пусть страдают. :)
А написать полноценный драйвер на незнакомую ККМ, это эпичная жесть...
9 июл 18, 17:16    [21557058]     Ответить | Цитировать Сообщить модератору
 Re: COM порт  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3528
L_argo
Те ККМ, которые есть в гос.реестре всегда имеют дистрибьюторов, у кот. всегда есть необходимый софт.

Да, бывает - что только у них.
L_argo
Какой смысл продавать ККМ без софта ?????

Чтобы монополизировать рынок "дистрибьюторов".
Хотите поддержать? Пожалуйста, вот вам протокол, разбирайтесь, а мы потом посмотрим и напишем лицензию на софт, если захотим.

Это не простой рынок. Во всяком случае, в Украине. У меня программа, например, поддерживает все кассы, кроме одной. У неё "секретный" протокол и они его не дают. Даже протокол. Никому. Ну, кроме налоговой, при прохождении сертификации.
9 июл 18, 17:20    [21557070]     Ответить | Цитировать Сообщить модератору
 Re: COM порт  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3528
L_argo
А написать полноценный драйвер на незнакомую ККМ, это эпичная жесть...
Это обычная жизнь
Когда я поддерживал некоторые кассы, никаких драйверов ни в каком виде для них еще не было, от слова совсем. Я брал и писал. Никакой жести не видел.
9 июл 18, 17:22    [21557073]     Ответить | Цитировать Сообщить модератору
 Re: COM порт  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3528
Сейчас-то да, появились (для половины примерно).
9 июл 18, 17:23    [21557076]     Ответить | Цитировать Сообщить модератору
 Re: COM порт  [new]
s62
Member

Откуда: Жуковский
Сообщений: 820
Oleg_Spb
defecator,

блин :)

...
  While True do
    begin
      ReadFile(ComHndl, fByte, 1, BytesRead, @FOvr);
      inc(j);
...



Вопрос - команда SLEEP мне нужна? Или можно как-то событие повесить на СОМ? Если я убираю SLEEP, то ReadFile либо ни чего не считывает, либо считывает только малую часть ответа и на этом все...
Если SLEEP поставить 1000, то все работает

Вы код откуда-то позаимствовали? Есть параметр @FOvr, который используется при асинхронном чтении, но код написан так, как для синхронного.
Чтобы функция ReadFile ждала некоторое время, прежде, чем возвратить результат, нужно задать соответствующие таймауты для порта. См. фунцию SetCommTimeouts.
9 июл 18, 18:22    [21557340]     Ответить | Цитировать Сообщить модератору
 Re: COM порт  [new]
s62
Member

Откуда: Жуковский
Сообщений: 820
s62,
например вот так
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 мс. Таймауты для записи особой роли не играют, как я понимаю, т.к. обычно по-моему в порт всё пишется без задержек.
9 июл 18, 18:34    [21557386]     Ответить | Цитировать Сообщить модератору
 Re: COM порт  [new]
s62
Member

Откуда: Жуковский
Сообщений: 820
s62
т.к. обычно по-моему в порт всё пишется без задержек.

Если только не используется CTS например и т.п. )
9 июл 18, 19:34    [21557523]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить