Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.08.07;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.003 c
15-1303135594
mdfe
2011-04-18 18:06
2011.08.07
Есть кто живой?


2-1302509942
Максон
2011-04-11 12:19
2011.08.07
StringGrid и таблица Word


1-1261562629
DL
2009-12-23 13:03
2011.08.07
парсин строки имени файла


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


1-1261155802
Дмитрий Белькевич
2009-12-18 20:03
2011.08.07
for in - можно ли добраться до переменной итератора?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский