![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
COM port фискального принтера [XP]
mefodiy © (2011-04-28 09:01:00)Есть фискальный принтер чеков 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);
но никакой реакции принтера нет.
С компортом работаю впервые и что-то делаю не так. Прошу помочь.
DiamondShark (2011-04-28 18:26:00) [1]У тебя галиматья полная написана.
Разберись с протоколом.
http://www.datecs.bg/uk/get_file.php?doc_id=8A2D4E1BCE101ECFBCADE7A184348584
mefodiy (2011-04-28 15:54:00) [2]А надо ли при открытии порта изменять 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?
MBo (2011-04-28 15:37:00) [3]вот 2D и есть 45, если это не случайное совпадение данного байта в закодированной посылке.
Остальное надо по документации разбирать.
Чего не хватает - логика+научный тык
mefodiy (2011-04-28 15:05:00) [4]Вот команда 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 14:46:00) [5]в Options Portmon-а включи Show Hex, и посылаемые данные будут в шестн. виде выводиться
mefodiy (2011-04-28 13:59:00) [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
Помогите разобраться.
Плохиш (2011-04-28 11:09:00) [7]Во фирмы, заставляют кодить тех, кто даже имеющуюся документацию понять не в состоянии.
Anatoly Podgoretsky (2011-04-28 11:05:00) [8]Ты что телепатов ищешь, там вопросов, по типам, по значениям гораздо более, а не только один Buff
Так дело не пойдет
mefodiy (2011-04-28 10:34:00) [9]112500 - > 115200- да, конечно
Уверен, что нужно посылать 45 в текстовом виде, а не один байт со значением 45? - что нужно изменить в тексте, который я привел?
Если в документации не сказано, можно проверить, что реально посылается штатной программой с помощью portmon - поищу программу и попробую
Не видать инициализации буфера - Buff объявлен как string и перед записью в порт присваиваю Buff := '45'. Что еще нужно сделать?
Anatoly Podgoretsky (2011-04-28 09:53:00) [10]Не видать инициализации буфера
MBo (2011-04-28 09:17:00) [11]112500 - > 115200
Уверен, что нужно посылать 45 в текстовом виде, а не один байт со значением 45?
Если в документации не сказано, можно проверить, что реально посылается штатной программой с помощью portmon