:: Visual Foxpro, Foxpro for DOS
Re: Ответ от COM-порта
_vit

Сообщений: 5175
Дата регистрации: 29.07.2002
Igor Korolyov
Ну это когда есть некоторая программа от производителя кассы, которая САМА общается с кассой по USB/RS232/прочим соединениям, а уже твой софт работает с кассой через эту программу. По сути ComProxy это, вероятно, вариант такой программы - но он, видимо не лучший, т.к. для твоей программы выставляет не какой-то "приличный" COM интерфейс (наподобии того который ворд/эксель даёт для управления собой), а такой же низкоуровневый "виртуальный последовательный порт".

Тетка на ихнем сайте мутит, но я так понял что ComProxy это сплиттер (разветвитель) СОМ порта.
Он должен быть "прозрачным" но может в нем что и намутили как и в описании.
Я бы снифернул обмен утилиты производителя и программы ТС с кассой как с ComProxy так и без и сравнил.
Иначе можно долго "тыкать пальцем в небо".
Ratings: 0 negative/0 positive
Re: Ответ от COM-порта
matod

Сообщений: 3062
Откуда: Иркутск
Дата регистрации: 31.10.2001
Насчет ComProxy все верно - первоначально устройство должно работать через СОМ или виртуальный СОМ. ComProxy - надстройка, которая оставляет для прикладного ПО все по-старому, а сама перехватывает трафик, чтобы еще успевать между делом выполнять передачу фискальных данных.
Ratings: 0 negative/0 positive
Re: Ответ от COM-порта
matod

Сообщений: 3062
Откуда: Иркутск
Дата регистрации: 31.10.2001
Аспид
Леокади
"Связь FM16 (далее - ККТ) с компьютером осуществляется по интерфейсу RS232 или USB в режиме виртуального COM порта. Параметры COM порта по умолчанию - 57600,n,8,1"
Сочувствую.
Какой .... злодей решил купить такую кассу. Когда на рынке нормальных полно.

А что не так? Это вообще не касса, это "принтер с фискальным регистратором". Т.е. устройство для "конструктора", разных самодельных систем.
Преимущество в его более низкой цене. Мы с этим устройством в прошлом году связались, т.к. пользователи одной нашей программы попросили "дешево и сердито". Вот мы им и сделали кассу в виде ПК+VikiPrint + наша кассовая программка. Это не настоящий конкурент "большим" кассам, а вещь для узкой области - деревенских и прочих мелких магазинов, в ассортименте которых есть алкоголь.
Ratings: 0 negative/0 positive
Re: Ответ от COM-порта
matod

Сообщений: 3062
Откуда: Иркутск
Дата регистрации: 31.10.2001
[quote Леокади]Пробовала и время увеличивать. Удивительно, что оригинальная утилита мгновенно срабатывает[/quote]
Это точно поможет, ситуация 1 в 1 - без ComProxy работало, с ним перестало из-за того, что оставался открытым чек и не срабатывал запрос смены или чего-то еще.

[quot]Можно пример кода? Я через API не работала с COM[/quote]

Можно, чуть позже примерно покажу, как я делю.
Ratings: 0 negative/0 positive
Re: Ответ от COM-порта
matod

Сообщений: 3062
Откуда: Иркутск
Дата регистрации: 31.10.2001
Цитата:
Можно пример кода? Я через API не работала с COM

Примерно вот так:

Это код для открытия порта, хендлер запоминаем в переменной hh, затем он используется для работы с портом.
* Открытие файла или порта
Declare Long CreateFile IN "kernel32.dll" AS COM_Create;
String lpFileName, ; && Имя файла
Long dwDesiredAccess, ; && Режим доступа
Long dwShareMode, ; && Совместное использование. 0 - экслюзивный доступ.
Long lpSecurityAttributes, ; &&
Long dwCreationDisposition, ; && Действия по созданию файла (2-создавать новый, 1-создавать, если не существует, 4-открыть, 3-открыть существующий, 5-обрезать
Long dwFlagsAndAttributes, ; && Атрибуты
Long hTemplateFile
* Параметры таймаута
Declare Long SetCommTimeouts IN "kernel32.dll" AS COM_SetTimeouts;
Long p1, ;
String lpCommTimeouts
* Установка параметров COM-порта
Declare Long SetCommState IN "kernel32.dll" AS COM_SetState;
Long,;
String
* Формирование DCB-структуры с параметрами устройства по текстовой строке параметров
Declare Long BuildCommDCB IN "kernel32.dll" AS COM_DCB;
String,;
String
* Чтение файла или порта
Declare Long ReadFile IN "kernel32.dll" AS COM_Read;
Long hFile, ;
String @ lpBuffer,;
Long nNumberOfBytesToRead,;
Long @ lpNumberOfBytesRead,;
String lpOverlapped
* Запись в файл или порт
Declare Long WriteFile IN "kernel32.dll" AS COM_Write;
Long hFile,;
String lpBuffer,;
Long nNumberOfBytesToWrite,;
Long @lpNumberOfBytesWritten,;
Long lpOverlapped
* закрытие файла/порта
Declare Long CloseHandle IN "kernel32.dll" AS COM_Close;
Long hObject
Declare Long GetLastError In "Kernel32.dll" AS COM_GetLastError
* Открытие порта
local hh, lcErr
hh = COM_Create( .PortName, BITOR( 0x80000000, 0x40000000 ), 0, 0, 3, 0x80, 0 )
if m.hh <= 0
lcErr = COM_GetLastError()
error [Не удалось открыть порт.]
endif
* строка с параметрами соединения
local ss
ss = BINTOC( 28, '4RS') +;
BINTOC( .devBaud, '4RS') +;
BINTOC( 20625, '4RS') +;
BINTOC( 134217728, '4RS') +;
BINTOC( 524800, '4RS') +;
BINTOC( 1249536, '4RS') +;
BINTOC( 8, '1RS') +;
chr( 0 )+;
chr( 0 )+;
chr( 0 )+;
chr( 0 )+;
chr( 0 )+;
chr( 0 )+;
chr( 0 )+;
BINTOC( 0, '4RS')
if COM_SetState( m.hh, m.ss ) = 0
lcErr = COM_GetLastError()
error [Не удалось настроить параметры порта.]
endif
ss = BINTOC( 0, '4RS' ) +;
BINTOC( 1, '4RS' ) +;
BINTOC( 10, '4RS' ) +;
BINTOC( 0, '4RS' ) +;
BINTOC( 0, '4RS' )
if COM_SetTimeouts( m.hh, m.ss ) = 0
lcErr = COM_GetLastError()
error [Не удалось установить режим таймаута для порта.]
endif

Потом чтение и запись в порт
* Чтение из порта
local lnRes, lnRead, lcBuf, lnRead, lnEndTime, pp, ss, lnBufSize
lnRead = 1
lnBufSize = 128
lcBuf = repli( chr(0), m.lnBufSize )
lnEndTime = seconds() + 5 && время ожидания ответа
do while m.lnRead>0 and seconds() <= m.lnEndTime
Delay( 0.2 ) && задержка между попытками
lnRead = 0
if COM_Read( m.hh, @lcBuf, m.lnBufSize, @lnRead, 0 ) = 0
lcError = COM_GetLastError()
error [Ошибка чтения порта.]
endif
if m.lnRead > 0
vcData = m.vcData + left( m.lcBuf, m.lnRead )
else
if m.lnRead = 0
ok = .t.
endif
endif
enddo
if not m.ok
error [Истекло время ожидания ответа от устройства.]
endif

* Запись в порт
local nn, lnBytesWrite
lnBytesWrite = 0
nn = len( m.tcData )
IF COM_Write( m.hh, m.tcData, m.nn, @lnBytesWrite, 0 ) = 0
lcError = COM_GetLastError()
error [Ошибка записи в порт.]
ENDIF

Это не рабочий пример, а выдранный из контекста код. На самом деле у меня для работы с СОМ портом сделан класс, внутри которого спрятаны все эти вызовы API-функций. Для чтения порта сделано несколько вариантов - чтение заданного числа байт, чтение до тех пор, пока не встретится стоп-байт и т.д.
Ratings: 0 negative/0 positive
Re: Ответ от COM-порта
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
matod
Это вообще не касса, это "принтер с фискальным регистратором". Т.е. устройство для "конструктора", разных самодельных систем.
Штрих-M01Ф, упоминаемый в соседней ветке (с примерами кода), тоже только чековый "принтер с фискальным регистратором". И тоже "устройство для "конструктора" разных самодельных систем". Однако общение сделано через стандартный CreateObject() и никаких плясок с DLL, структурами, WinAPI и т.д.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Ответ от COM-порта
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Посмотрев примеры "программирования" всех этих касс в соседних темах, я бы поостерёгся называть приведенный вполне прямолинейный и понятный код "плясками"

.AttrNumber=1214
.AttrValue=3
If .WriteAttribute() <> 0 Then
...
.RegisterNumber=47
.GetRegister()
...
.CaptionPurpose=89
.Caption='Кассир: ...'
.SetCaption()

Вот это я бы назвал даже не "плясками", а тем простым русским словом на букву Е, против которого так сильно выступает сфинкс


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Ответ от COM-порта
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Игорь, хорошо писать не вникая)
За командой .AttrNumber=1214 стоит куча кода, в приведенном примере.
Тут это все надо реализовать самому.

Я тупо хотел имитатор кассы написать, которая будет реагировать на команды адекватно, так плюнул.
А тут деваться некуда, надо все реализовать.
И что интересно, ни у кого кто пользуется...
Igor Korolyov
тем простым русским словом на букву Е
даже близко не возникает вопроса ТС.
Там же других проблем полно.


------------------
Ratings: 0 negative/0 positive
Re: Ответ от COM-порта
Леокади
Автор

Сообщений: 89
Дата регистрации: 27.06.2005
Ребята, я полазила на других ветках форума, нашла тему "как гарантированно дождаться ответа от COM-порта" и там был ответ Игоря Королева (см. вложение) по настройкам порта

Мне помогло. Вот оно Счаааастье )))
Ratings: 0 negative/0 positive
Re: Ответ от COM-порта
Леокади
Автор

Сообщений: 89
Дата регистрации: 27.06.2005
ой, простите от Аспида.
[attachment 27903 ]
Ratings: 0 negative/0 positive
Re: Ответ от COM-порта
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
Igor Korolyov
Посмотрев примеры "программирования" всех этих касс в соседних темах, я бы поостерёгся называть приведенный вполне прямолинейный и понятный код "плясками"
Вот то, чем пришлось заниматься Matod и есть то слово на букву Е.
А тут всего лишь 1(один) объект и работа с его свойствами и методами без параметров.


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Ответ от COM-порта
matod

Сообщений: 3062
Откуда: Иркутск
Дата регистрации: 31.10.2001
ssa
Штрих-M01Ф, упоминаемый в соседней ветке (с примерами кода), тоже только чековый "принтер с фискальным регистратором". И тоже "устройство для "конструктора" разных самодельных систем". Однако общение сделано через стандартный CreateObject() и никаких плясок с DLL, структурами, WinAPI и т.д.

Ну, решение принимал не я, выбирали исходя из доступности, цены и др. От меня требовалось ответить - могу ли я быстро сделать программу по предоставленной документации. Поскольку у меня уже был опыт работы с СОМ и т.к. я не увидел ничего ужасного, сказал "да".

При реализации у меня возникли затруднения в основном с установкой параметров порта, но поиск в интернете довольно быстро дал результат, который был нужен. Часть нашел кажется здесь.

Я сделал класс-обертку для работы с СОМ (точнее, немного допилил тот, который сделал раньше), сделал класс для общения с принтером, спрятав весь протокол в методах. Устройство для тестирования мне предоставили, основу сделал за пару недель.

Может это и не самое хорошее устройство, но оно вполне поддалось приручению, пользователи работают уже год некоторые. Поскольку я впервые столкнулся с кассовым ПО, то не думаю, что другие модели мне сильно бы облегчили жизнь.
Ratings: 0 negative/0 positive
Re: Ответ от COM-порта
matod

Сообщений: 3062
Откуда: Иркутск
Дата регистрации: 31.10.2001
ssa
Вот то, чем пришлось заниматься Matod и есть то слово на букву Е.
А тут всего лишь 1(один) объект и работа с его свойствами и методами без параметров.

Ну, это дело индивидуальное. В целом весь этот офисный софт не очень интересное занятие обычно. Время от времени перепадает возможность поработать с устройством напрямую. Это довольно интересно, на мой вкус - я получил удовольствие "от очередной победы разума над бездушным железом" . Возможно, качество софта получается не самое высокое, но работает приемлемо, доход приносит.

В конечном итоге, у меня тоже - один объект и работа со свойствами и методами (правда, с параметрами, но не вижу с этим проблем). Короче, не знаю, чего вы там ужас-ужас увидели на букву Е. :al:
Ratings: 0 negative/0 positive
Re: Ответ от COM-порта
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Решение от matod только выглядит на букву Е, потому что он типично объеденил в одно целое два разных класса - класс оберток для функций Winapi и класс для работы собственно с устройством.
Стоит разделить эти классы, и его решение станет простым, проблема будет только с параметрами, на что он и сам указывает.
Ratings: 1 negative/0 positive
Re: Ответ от COM-порта
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
matod
Короче, не знаю, чего вы там ужас-ужас увидели на букву Е.
:
Да кто ж называл твое решение так?
Запутались все)))
Это Игорь обозвал так альтернативы.
И ты все решил, и устраивает)
Я собственно писал ТС.
Там то явно опыта поменьше.
А так согласен, интересно с железом поработать)))
Только в данном случае, слишком много других проблем.

И как очевидно, у тебя написано все давно, и ты пользуешь свой класс, так же как мы объект атола (все равно, и на него свой класс вешать приходится)
Ты спокойно занимаешься проблемами более высокого уровня.


------------------
Ratings: 0 negative/0 positive
Re: Ответ от COM-порта
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
matod
основу сделал за пару недель.
Ну вот, а в нашем случае на это тратили время разработчики из атолла/штриха и иже с ними. А мы за пару дней нарисовали класс-обертку и в ус не дуем.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Ответ от COM-порта
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
ssa
Вот то, чем пришлось заниматься Matod и есть то слово на букву Е.
Ну я такого не заметил...
ssa
А тут всего лишь 1(один) объект и работа с его свойствами и методами без параметров.
Вот именно. И "логика" установления значения, или извлечения значения через 2-3-4 отдельных вызова это и есть оно самое.
Не знаю исходя из каких соображений авторы сего "драйвера" (кстати, с чего это все называют сей софт драйвером то?) не сделали адекватную реализацию в том же старом добром COM но методами С параметрами, подобъектами... Но вышло просто "вынос мозга".

При том что по хорошему стоило даже и не 1 класс/объект делать (ну удобно же когда "документ" - это объект со своими свойствами/методами, параметры - пускай и "просто список", но таки список - с банальным энумератором или вообще чистый массив) - для пущего удобства. Но либо нешмогли, либо какой-то очень уж хитрый план... Свалить ВСЁ в один объект... Нет, я не понимаю их логики.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Ответ от COM-порта
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Аспид
За командой .AttrNumber=1214 стоит куча кода, в приведенном примере.
Тут это все надо реализовать самому.
Конкретно за этой - нет. Я уверен что софт вообще по этой команде никаких "телодвижений" не совершает - вот после пары следующих - когда уже готова инструкция ЦЕЛИКОМ - тогда да...
Это то совершенно понятно - но давать такого вида прослойку... Это прям издевательство какое то Собирать одну "команду" путём 3 и более отдельных вызовов/обращений к свойствам...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Ответ от COM-порта
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Igor Korolyov
Это прям издевательство какое то Собирать одну "команду" путём 3 и более отдельных вызовов/обращений к свойствам...
Да. Маразм)
Но по любому, надо читать.
После этого принять что есть, и написать сверху свое, вполне удобное для использования, и забыть... про этот "драйвер")))


------------------
Ratings: 0 negative/0 positive
Re: Ответ от COM-порта
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Аспид
Igor Korolyov
Это прям издевательство какое то Собирать одну "команду" путём 3 и более отдельных вызовов/обращений к свойствам...
Да. Маразм)

Так оберните эти команды в обертки, и свойства обернутся в параметры.
Если эти обертки сведете в объектную модель, то код от JS в фоксе сведется в более понятные несколько процедур.
Ratings: 2 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 30 (Гостей: 30)

© 2000-2024 Fox Club 
Яндекс.Метрика