Текущий архив: 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.49 MB
Время: 0.002 c