Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.08.07;
Скачать: CL | DM;

Вниз

COM port фискального принтера   Найти похожие ветки 

 
mefodiy   (2011-04-28 09:01) [0]

Есть фискальный принтер чеков FP-1000 фирмы Datecs, который подсоединен к компорту ПК. Нужно печатать чеки. Есть документация с описанием команд, где, например, команда с кодом 45 отрезает чек. У принтера есть своя програмка откуда можно посылать команды. Програмка нормально работает. Если в поле едит ввести 45 и нажать на соответствующую кногпку, то принтер действительно отрезает кусочек бумаги от рулона.
В соответствии с тем, что нашел в интернете, делаю так.
 //--- Создаю описатель порта ---
 hPort := CreateFile(PChar("COM1"),
                     GENERIC_READ or GENERIC_WRITE,
                     0,
                     nil,
                     OPEN_EXISTING,
                     0,
                     0
                    );

  //--- Проверяю нормально ли открылся порт ---
 if hPort = INVALID_HANDLE_VALUE then
   raise Exception.Create("Error opening port " + PortComboBox.Text + "!");
 //--- Считываю параметры порта ---
 if not GetCommState(hPort,Dcb) then
   raise Exception.Create("Error getting port state!");
 //--- Изменяю нужные параметры порта ---
 Dcb.BaudRate := 112500;
 Dcb.Parity    := NOPARITY;
 Dcb.ByteSize := 8;
 Dcb.StopBits := ONESTOPBIT;
 //--- Устанавливаю параметры порта ---
 if not SetCommState(hPort, Dcb) then
   raise Exception.Create("Error setting port state!");
 //--- Очищаю очередь приема/передачи  порта ---
 if not PurgeComm(hPort, PURGE_TXCLEAR or PURGE_RXCLEAR) then
   raise Exception.Create("Error purging port!");
 //--- Перевожу порт в режим ожидания приема одного или нескольких символов (байт)---
 if not SetCommMask(hPort, EV_RXCHAR) then
   raise Exception.Create("Error setting port mask");
Затем посылаю команду
 if not WriteFile(hPort,
                 Buff[1],
                 nBytes,
                 wr_cnt,
                 nil
                ) then
   RaiseLastOSError;
 if wr_cnt <> nBytes then
   raise Exception.Create("Number of written bites less than required!");
где
 Buff   := "45";
 nBytes := Length(Buff);

но никакой реакции принтера нет.
С компортом работаю впервые и что-то делаю не так. Прошу помочь.


 
MBo ©   (2011-04-28 09:17) [1]

112500 - > 115200
Уверен, что нужно посылать 45 в текстовом виде, а не один байт со значением 45?
Если в документации не сказано, можно проверить, что реально посылается штатной программой с помощью portmon


 
Anatoly Podgoretsky ©   (2011-04-28 09:53) [2]

Не видать инициализации буфера


 
mefodiy   (2011-04-28 10:34) [3]

112500 - > 115200 - да, конечно
Уверен, что нужно посылать 45 в текстовом виде, а не один байт со значением 45? - что нужно изменить в тексте, который я привел?
Если в документации не сказано, можно проверить, что реально посылается штатной программой с помощью portmon - поищу программу и попробую

Не видать инициализации буфера - Buff объявлен как string и перед записью в порт присваиваю  Buff := "45". Что еще нужно сделать?


 
Anatoly Podgoretsky ©   (2011-04-28 11:05) [4]

Ты что телепатов ищешь, там вопросов, по типам, по значениям гораздо более, а не только один Buff

Так дело не пойдет


 
Плохиш ©   (2011-04-28 11:09) [5]

Во фирмы, заставляют кодить тех, кто даже имеющуюся документацию понять не в состоянии.


 
mefodiy   (2011-04-28 13:59) [6]

>>MBo ©
Для родной програмки Portmon дал при открытии порта
0 0.00005331 TestFP300_1000. IRP_MJ_CREATE Serial0 SUCCESS Options: Open  
1 0.00000253 TestFP300_1000. IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS  
2 0.00000072 TestFP300_1000. IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS  
3 0.00000068 TestFP300_1000. IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS  
4 0.00000074 TestFP300_1000. IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS  
5 0.00000068 TestFP300_1000. IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS  
6 0.00000060 TestFP300_1000. IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS  
7 0.00000053 TestFP300_1000. IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS  
8 0.00000053 TestFP300_1000. IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS  
9 0.00000747 TestFP300_1000. IOCTL_SERIAL_SET_BAUD_RATE Serial0 SUCCESS Rate: 115200
10 0.00000338 TestFP300_1000. IOCTL_SERIAL_SET_RTS Serial0 SUCCESS  
11 0.00000353 TestFP300_1000. IOCTL_SERIAL_CLR_DTR Serial0 SUCCESS  
12 0.00000202 TestFP300_1000. IOCTL_SERIAL_SET_LINE_CONTROL Serial0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
13 0.00000083 TestFP300_1000. IOCTL_SERIAL_SET_CHAR Serial0 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13
14 0.00000223 TestFP300_1000. IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake:0 Replace:40 XonLimit:2048 XoffLimit:512
15 0.00000066 TestFP300_1000. IOCTL_SERIAL_GET_TIMEOUTS Serial0 SUCCESS  
16 0.00000066 TestFP300_1000. IOCTL_SERIAL_SET_TIMEOUTS Serial0 SUCCESS RI:3000 RM:1 RC:3000 WM:1 WC:1000
17 0.00000465 TestFP300_1000. IOCTL_SERIAL_SET_QUEUE_SIZE Serial0 SUCCESS InSize: 32768 OutSize: 1024

а при посылке команды 45
0 0.00002282 TestFP300_1000. IRP_MJ_WRITE Serial0 SUCCESS Length 1: .
1 0.00000144 TestFP300_1000. IRP_MJ_FLUSH_BUFFERS Serial0 SUCCESS  
2 0.00006040 TestFP300_1000. IRP_MJ_WRITE Serial0 SUCCESS Length 1: $
3 0.00000098 TestFP300_1000. IRP_MJ_FLUSH_BUFFERS Serial0 SUCCESS  
4 0.00006963 TestFP300_1000. IRP_MJ_WRITE Serial0 SUCCESS Length 1:  
5 0.00000093 TestFP300_1000. IRP_MJ_FLUSH_BUFFERS Serial0 SUCCESS  
6 0.00007092 TestFP300_1000. IRP_MJ_WRITE Serial0 SUCCESS Length 1: -
7 0.00000093 TestFP300_1000. IRP_MJ_FLUSH_BUFFERS Serial0 SUCCESS  
8 0.00006851 TestFP300_1000. IRP_MJ_WRITE Serial0 SUCCESS Length 1: .
9 0.00000069 TestFP300_1000. IRP_MJ_FLUSH_BUFFERS Serial0 SUCCESS  
10 0.00007408 TestFP300_1000. IRP_MJ_WRITE Serial0 SUCCESS Length 1: 0
11 0.00000092 TestFP300_1000. IRP_MJ_FLUSH_BUFFERS Serial0 SUCCESS  
12 0.00007118 TestFP300_1000. IRP_MJ_WRITE Serial0 SUCCESS Length 1: 0
13 0.00000092 TestFP300_1000. IRP_MJ_FLUSH_BUFFERS Serial0 SUCCESS  
14 0.00006370 TestFP300_1000. IRP_MJ_WRITE Serial0 SUCCESS Length 1: 7
15 0.00000092 TestFP300_1000. IRP_MJ_FLUSH_BUFFERS Serial0 SUCCESS  
16 0.00007471 TestFP300_1000. IRP_MJ_WRITE Serial0 SUCCESS Length 1: 6
17 0.00000092 TestFP300_1000. IRP_MJ_FLUSH_BUFFERS Serial0 SUCCESS  
18 0.00007031 TestFP300_1000. IRP_MJ_WRITE Serial0 SUCCESS Length 1: .
19 0.00000093 TestFP300_1000. IRP_MJ_FLUSH_BUFFERS Serial0 SUCCESS  
Помогите разобраться.


 
MBo ©   (2011-04-28 14:46) [7]

в Options Portmon-а включи Show Hex, и посылаемые данные будут в шестн. виде выводиться


 
mefodiy   (2011-04-28 15:05) [8]

Вот команда 45 в 16-ричном виде

0 0.00002185 TestFP300_1000. IRP_MJ_WRITE Serial0 SUCCESS Length 1: 01  
1 0.00000196 TestFP300_1000. IRP_MJ_FLUSH_BUFFERS Serial0 SUCCESS  
2 0.00005037 TestFP300_1000. IRP_MJ_WRITE Serial0 SUCCESS Length 1: 24  
3 0.00000115 TestFP300_1000. IRP_MJ_FLUSH_BUFFERS Serial0 SUCCESS  
4 0.00006603 TestFP300_1000. IRP_MJ_WRITE Serial0 SUCCESS Length 1: 20  
5 0.00000107 TestFP300_1000. IRP_MJ_FLUSH_BUFFERS Serial0 SUCCESS  
6 0.00006834 TestFP300_1000. IRP_MJ_WRITE Serial0 SUCCESS Length 1: 2D  
7 0.00000109 TestFP300_1000. IRP_MJ_FLUSH_BUFFERS Serial0 SUCCESS  
8 0.00006042 TestFP300_1000. IRP_MJ_WRITE Serial0 SUCCESS Length 1: 05  
9 0.00000081 TestFP300_1000. IRP_MJ_FLUSH_BUFFERS Serial0 SUCCESS  
10 0.00006161 TestFP300_1000. IRP_MJ_WRITE Serial0 SUCCESS Length 1: 30  
11 0.00000141 TestFP300_1000. IRP_MJ_FLUSH_BUFFERS Serial0 SUCCESS  
12 0.00004553 TestFP300_1000. IRP_MJ_WRITE Serial0 SUCCESS Length 1: 30  
13 0.00000128 TestFP300_1000. IRP_MJ_FLUSH_BUFFERS Serial0 SUCCESS  
14 0.00006517 TestFP300_1000. IRP_MJ_WRITE Serial0 SUCCESS Length 1: 37  
15 0.00000111 TestFP300_1000. IRP_MJ_FLUSH_BUFFERS Serial0 SUCCESS  
16 0.00006479 TestFP300_1000. IRP_MJ_WRITE Serial0 SUCCESS Length 1: 36  
17 0.00000087 TestFP300_1000. IRP_MJ_FLUSH_BUFFERS Serial0 SUCCESS  
18 0.00006552 TestFP300_1000. IRP_MJ_WRITE Serial0 SUCCESS Length 1: 03  
19 0.00000116 TestFP300_1000. IRP_MJ_FLUSH_BUFFERS Serial0 SUCCESS


 
MBo ©   (2011-04-28 15:37) [9]

вот 2D и есть 45, если это не случайное совпадение данного байта в закодированной посылке.

Остальное надо по документации разбирать.
Чего не хватает - логика+научный тык


 
mefodiy   (2011-04-28 15:54) [10]

А надо ли при открытии порта изменять timuots и queue size на те, которые устанавливаются оригинальной программой.
Таймаут как, я понимаю, можно установить так:
 if not GetCommTimeOuts(hPort,Cto)
   then RaiseLastOSError;

 Cto.ReadIntervalTimeout         := 3000;        //---RI=3000---
 Cto.ReadTotalTimeoutMultiplier  := 1;           //---RM=1---
 Cto.ReadTotalTimeoutConstant    := 3000;        //---RC=3000---
 Cto.WriteTotalTimeoutMultiplier := 1;           //---WM=1---
 Cto.WriteTotalTimeoutConstant   := 1000;        //---WC=1000---

А как быть с queue size?


 
DiamondShark ©   (2011-04-28 18:26) [11]

У тебя галиматья полная написана.

Разберись с протоколом.
http://www.datecs.bg/uk/get_file.php?doc_id=8A2D4E1BCE101ECFBCADE7A184348584



Страницы: 1 вся ветка

Текущий архив: 2011.08.07;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.007 c
2-1303666383
GreyWolf83
2011-04-24 21:33
2011.08.07
Непонятки со ссылками во встроенном TWebBrowser


15-1302298974
Re
2011-04-09 01:42
2011.08.07
Delphi и Win7


15-1303035864
Пит
2011-04-17 14:24
2011.08.07
Очень нужен совет от тех, кто разбирается в биллинге


15-1303019199
Inovet
2011-04-17 09:46
2011.08.07
Монеты, посвященные олипиаде в Сочи 2014


2-1303912277
young and strong
2011-04-27 17:51
2011.08.07
выбор типа параметра