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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Это не простой рынок. Во всяком случае, в Украине. У меня программа, например, поддерживает все кассы, кроме одной. У неё "секретный" протокол и они его не дают. Даже протокол. Никому. Ну, кроме налоговой, при прохождении сертификации.
...
Рейтинг: 0 / 0
COM порт
    #39671734
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argoА написать полноценный драйвер на незнакомую ККМ, это эпичная жесть...Это обычная жизнь
Когда я поддерживал некоторые кассы, никаких драйверов ни в каком виде для них еще не было, от слова совсем. Я брал и писал. Никакой жести не видел.
...
Рейтинг: 0 / 0
COM порт
    #39671735
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас-то да, появились (для половины примерно).
...
Рейтинг: 0 / 0
COM порт
    #39671765
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
COM порт
    #39671773
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
COM порт
    #39671792
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62т.к. обычно по-моему в порт всё пишется без задержек.
Если только не используется CTS например и т.п. )
...
Рейтинг: 0 / 0
COM порт
    #39671984
Oleg_Spb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
s62Вы код откуда-то позаимствовали? Есть параметр @FOvr, который используется при асинхронном чтении, но код написан так, как для синхронного.
Чтобы функция ReadFile ждала некоторое время, прежде, чем возвратить результат, нужно задать соответствующие таймауты для порта. См. фунцию SetCommTimeouts .

Да это я эксперементировал... Уже убрал :)
Но проблема оказалась не в том месте где я искал.

Было

Код: pascal
1.
  FComHndl := CreateFile(DeviceName, GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);



сделал

Код: pascal
1.
  FComHndl := CreateFile(DeviceName, GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL , 0);



После этого, даже без SLEEP все работает.
...
Рейтинг: 0 / 0
COM порт
    #39672000
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот как ошибки исправляются, а я то думал :)
...
Рейтинг: 0 / 0
COM порт
    #39672002
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
YuRockВот как ошибки исправляются, а я то думал :)
Человек изобретает велосипед, не надо ему мешать )))
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / COM порт
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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