BG Development


Страници: (2) [1] 2   ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Комуникация с фискален принтер Датекс
sunwithface
Публикувано на: 09-05-2019, 13:48
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 9
Регистриран на: 09.05.19



Здравейте,
Опитвам се да свържа фискален принтер Датекс DP-150 с уеб приложение, което да изпраща команди към устройството по COM порт.
Успях да намеря няколко примера, с помощта, на които да изпращам пакетирани съобщения и да получавам отговор (кода по-долу). Проблемът, е че не мога да разебра как да взема поредния номер на рамката (SEQ) за да мога да изпращам команди. В момента успявам единствено да изпратя съобщение с команда 4AH (74 / Получаване на статус-байтовете) със стойност на SEQ 0x20 и отговор (<Buffer 16 01 31 20 4a 80 a0 80 80 84 82 04 80 a0 80 80 84 82 05 30 36 3f 30 03>), което за SEQ връща 20, което не ми върши работа.

Бихте ли ми дали насоки как да подходя?

Кода е писан на JavaScript (Node) и е използвана библиотеката serialport за връзка към порта nodejs serialport

CODE

const encode = (seq, command, data) => {
   const preamble = 0x01;
   const postamble = 0x05;
   const terminator = 0x03;

   let bcc = 0;
   let len = 32 + 4 + data.length;
   bcc += len;
   bcc += ord(seq);
   bcc += ord(command);
   for (i = 0; i < data.length; i++) {
       bcc += bcc + ord(data.charAt(i));
   }
   bcc += 0x05;

   let b1 = 0x30 + (bcc - (bcc % 4096)) / 4096;
   let hlp = bcc % 4096;
   let b2 = 0x30 + (hlp - (hlp % 256)) / 256;
   hlp = bcc % 256;
   let b3 = 0x30 + (hlp - (hlp % 16)) / 16;
   hlp = bcc % 16;
   let b4 = 0x30 + hlp;
   
   let result = chr(preamble) + chr(len) + chr(seq) + chr(command) + data + chr(postamble) + chr(b1) + chr(b2) + chr(b3) + chr(b4) + chr(terminator);

   return result;
}

const ord = string => {
   var str = string + '';
   var code = str.charCodeAt(0);
 
   if (code >= 0xD800 && code <= 0xDBFF) {
     var hi = code;
     if (str.length === 1) {
       return code;
     }
     var low = str.charCodeAt(1);
     return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000
   }
   if (code >= 0xDC00 && code <= 0xDFFF) {
     return code;
   }
 
   return code
};

const chr = string => {
   if (string > 0xFFFF) {
       string -= 0x10000
       return String.fromCharCode(0xD800 + (string >> 10), 0xDC00 + (string & 0x3FF))
     }
     return String.fromCharCode(string)
};



PMEmail Poster
Top
thrawn
Публикувано на: 09-05-2019, 16:04
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2232
Регистриран на: 17.01.17



Номерът на рамката не се взима от никъде. Той се подава от приложението и се връща в отговор от устройството (за да видиш точно на коя команда ти отговаря).

При съвпадение на номер на рамка с предходната команда устройството не прави нищо а само връща предходния отговор. Затова е желателно комуникацията да се започва с команда за извличане на статус. Така дори номерът на рамката да съвпадне с предходния ще се получи що годе адекватен отговор. А при следващата команда номерът се увеличава с 1-ца.

Тук вече си зависи от теб дали винаги ще почваш с твърдо зададен номер на рамка или със случайно генериран такъв. Също така, можеш да ползваш "акумулатор" който да пази последната рамка за текущата сесия на приложението.
PMEmail Poster
Top
sunwithface
Публикувано на: 09-05-2019, 16:31
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 9
Регистриран на: 09.05.19



Благодаря за изяснението!

Друг проблем обаче:

Изпращам команда 4АH (74 Получаване на статус-байтовете), със SEQ 0x20 и получаваме отговор със същия SEQ, но не мога да изпратя никаква друга команда (връща 16 15)
Същата команда също не мога да я изпратя със SEQ различен от 0x20

Възможно ли е контролната сума да е грешна и от там да идва отговор (16 15)?

Това мнение е било редактирано от sunwithface на 09-05-2019, 16:35
PMEmail Poster
Top
thrawn
Публикувано на: 09-05-2019, 16:37
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2232
Регистриран на: 17.01.17



Да, точно това значи 0х15

QUOTE
Непакетираните съобщения се състоят от един байт и те са:
а) NAK 15H
Този код се изпраща от Slave когато открие грешка в контролната сума или формата на полученото съобщение. Когато
Host получи NAK, той трябва да предаде отново съобщение със същия пореден номер.

...


Това мнение е било редактирано от thrawn на 09-05-2019, 16:37
PMEmail Poster
Top
sunwithface
Публикувано на: 09-05-2019, 16:52
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 9
Регистриран на: 09.05.19



В момента не можем да разберем статуса, който връща първата команда от където се чудим следното: възможно ли е статуса да ни казва че устройството не е настроено коректно?

Не можем и да разберем отговора от документацията:
Отговор: <S0><S1><S2><S3><S4><S5>|<NLines>|HdwInfo|InfoReciepts

Ето това е резултата от командата
<Buffer 16 01 31 20 4a 80 a0 80 80 84 82 04 80 a0 80 80 84 82 05 30 36 3f 30 03>
PMEmail Poster
Top
thrawn
Публикувано на: 09-05-2019, 17:55
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2232
Регистриран на: 17.01.17



Какво точно не можете да разберете?
Командата връща 6-те статус байта. Всичко по тях изглежда ОК. Няма вдигнати флагове за грешка.

Пробвайте да я изпратите веднъж с номер на рамка 0х20 и веднъж с 0х21.

Това мнение е било редактирано от thrawn на 09-05-2019, 17:57
PMEmail Poster
Top
sunwithface
Публикувано на: 09-05-2019, 17:59
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 9
Регистриран на: 09.05.19



QUOTE (thrawn @ 09-05-2019, 17:55)
Какво точно не можете да разберете?
Командата връща 6-те статус байта. Всичко по тях изглежда ОК. Няма вдигнати флагове за грешка.

Пробвайте да я изпратите веднъж с номер на рамка 0х20 и веднъж с 0х21.

Пробвах, но става единствено с 0x20, а с 0х21 или каквото и да е връща 16 15 :\
PMEmail Poster
Top
thrawn
Публикувано на: 09-05-2019, 18:00
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2232
Регистриран на: 17.01.17



Покажи какво изпращате с рамка 21
PMEmail Poster
Top
wqw
Публикувано на: 09-05-2019, 19:22
Quote Post


Group Icon
Име: Владимир Висулчев
Група: VIP
Ранг: Почетен член

Мнения: 6037
Регистриран на: 10.06.04



Сметката за чексумата е омазана
CODE
  let b1 = 0x30 + (bcc - (bcc % 4096)) / 4096;
  let hlp = bcc % 4096;
  let b2 = 0x30 + (hlp - (hlp % 256)) / 256;
  hlp = bcc % 256;
  let b3 = 0x30 + (hlp - (hlp % 16)) / 16;
  hlp = bcc % 16;
  let b4 = 0x30 + hlp;

WTF е логиката тука?

Това е от документацията
CODE
<BCC> Контролна сума (0000H-FFFFH)
дължина: 4 байта
стойност: 30H - 3FH
Сумата включва от <01> без него до <05> вкл. Всяка цифра от двата байта се предава
като и се прибави 30H. Например сумата 1AE3H се представя като 31H,3AH,3EH,33H.


1AE3h -> 01h, 0Ah, 0Eh, 03h -> 31h, 3Ah, 3Eh, 33h?

cheers,
</wqw>


--------------------
PMEmail PosterUsers Website
Top
thrawn
Публикувано на: 10-05-2019, 06:42
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2232
Регистриран на: 17.01.17



По скоро проблемът е в това
CODE
bcc += bcc + ord(data.charAt(i));


PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (2) [1] 2  Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0