MDB ARDUINO + банковский терминал VENDOTEK 3

Kabasya
Offline
Зарегистрирован: 20.05.2018

Добрый день ! 

Может кто сталкивался с подключение банковского терминала Vendotek 3 к ардуино 

Какая-то ошибка в коде, не пойму какая 

вроди бы все работает , но с инициализацией какая-то проблема 

Может кто поможет ? 

Код ниже : 


//#define F_CPU 16000000L

#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>
int  i ;
int cnt ;
int zapom=0;
int ya = 0;
#define C_TH1   0x10
#define C_TL1   0x10
#define C_TCCR1B  0x01
#define C_TH2   0x10
#define C_TL2   0x10
#define C_TCCR2B  0x01
#define C_TH3   0x10
#define C_TL3   0x10
#define C_TCCR3B  0x05
#define C_TH4   0x10
#define C_TL4   0x10
#define C_TCCR4B  0x03
#define C_TH5   0x10
#define C_TL5   0x10
#define C_TCCR5B  0x01


//#define   bitSet(a,b)   (a|=(1<<b))
//#define   bitClear(a,b) (a&=~(1<<b))
//#define   bitRead(a,b)  (a&(1<<b))


//int i;


volatile  unsigned char table_note[16]  = {0x01,0x05,0x0a,0x32,0x64,0,0,0,0,0,0,0,0,0,0,0};
volatile  unsigned char scaling_bill  ;
volatile  unsigned int  type_bill;
volatile  unsigned int  tek_bill;
volatile  uint8_t     tek_note;
volatile  uint8_t     cnt_err_mdb_bill;
//volatile  unsigned int  credit;

volatile  unsigned char buf_setup_0[6]    = {0x05,0x00,0x01,0x00,0x00,0x07};
volatile  unsigned char buf_setup_1[6]    = {0x05,0x01,0x01,0xF4,0x00,0x32};
//volatile  unsigned char buf_vend_req[6]   = {0x05,0x00,0x00,0x0A,0xFF,0xFF};
//volatile  unsigned char buf_vend_cacel[2] = {0x01,0x01};
//volatile  unsigned char buf_vend_success[4] = {0x03,0x00,0xFF,0xFF};
volatile  unsigned char buf_cash_sale[6]  = {0x05,0x05,0x00,0x0A,0xFF,0xFF};
volatile  unsigned char buf_expansion[] = {30,0x00,'I','V','T','0','0','0','0','0','0','0','0','0','1','2','3',
' ','0','0','0','0','0','0','0','0','0','4','5','1',0x01,0x16,0};
volatile  unsigned char buf_config_info_cash1[8];
volatile  unsigned char buf_credit_cash1[2];
volatile  unsigned char buf_perif_id_cash1[30];
volatile  uint8_t buf_data_tx_mdb[32];

volatile  unsigned char errors_cash1  = 0;



volatile  uint8_t flags_vmc =0;
#define   f_ack_f1      0
#define   f_ok_init_cash1   1
#define   f_ok_init_cash2   2
#define   f_work_cash2    3

volatile  uint8_t flags_vmc1_com  =0;
#define   f_setup_cash_vmc    0
#define   f_request_vmc     1
#define   f_success_vmc     2
#define   f_complete_vmc      3
#define   f_cancel_vmc      4
#define   f_failure_vmc     5
#define   f_reset_cash_vmc    6
#define   f_cash_sale_vmc     7

#define   C_CASHLESS_1      0x10

volatile  uint8_t crc_vmc   = 0;
volatile  uint8_t cnt_data_vmc  = 0;
volatile  uint8_t num_cashless  = 0;
volatile  void *u ;


volatile  char  in_rx_mdb;
//volatile  unsigned char  buf_rx_mdb[50];

//volatile  uint8_t buf_data_tx_mdb[32];
volatile  unsigned char buf_data_rx_mdb[32];
volatile  uint8_t cnt_tx_mdb  = 0;

volatile  uint8_t flags_mdb = 0xee;

#define   f_stop_bill     0
#define   f_end_rx_mdb    1
#define   f_not_pay_mdb   2
#define   f_stop_coin     3
#define   f_not_ans_mdb   4
#define   f_to_mdb      5
#define   f_com_mdb     6
#define   f_err_ans_mdb   7

volatile  uint8_t     to_s_mdb;

uint8_t   r_a ;
uint8_t   r_b;
uint8_t   r_c;
uint8_t   r_d;
uint8_t   r_e;
int *p  = (int*)0x500;


volatile  int cnt_rx_mdb  = 0;

volatile  int flags_tx_mdb  = 0;

#define   error_rx_mdb  7
volatile  int cnt_data_rx_mdb;
volatile  int crc_mdb;
volatile  int cnt_data_out_mdb;
volatile  int com_out_mdb;
volatile  char  out_tx_mdb;
volatile  int temp_tx_mdb;
volatile  int cnt_buf_mdb = 0;
volatile  uint8_t   in_test_mdb = 0;
volatile  uint8_t   check_mdb = 0;
volatile  uint8_t   com_mdb   = 0;
volatile  uint8_t   cnt_data_mdb  = 0 ;
volatile  uint8_t   in_rx_usart0;
volatile  uint8_t   in_price = 0;
volatile  uint8_t   in_num = 0;
volatile  uint8_t   in_num1 = 0;
volatile  uint8_t flags_tek_kkt = 0;
uint8_t   f_cashless    = 1;

void  wait_rx_mdb();
void  wait_tx_mdb();
void  trans_ks();
void  start_com_mdb();

//#define    UDR_MDB    UDR2
#define   USART_MDB_RX  USART2_RX_vect

void  reset_cash();
void  test_cashless_1();
void  pool_cash();
void  test_responce();
void  work_mdb_cash();
void  test_cashless_1();
void  tx_vmc();
void  pool_cashless();

void  test_responce_1();
void  test_config_info();
void  test_begin_session();
void  test_session_cancel();
void  test_approved();
void  test_denied();
void  test_end_session();
void  test_cancelled();
void  test_perif_id();
void  test_errors();
void  test_err_com();
void  init_mdb_cash();

void  vend_request();
void  setup_cash();
void  vend_cancel();
void  vend_success();
void  vend_failure();
void  session_complete();
void  cash_sale();
void  expansion_vmc();

void  desable_reader_vmc();
void  setup_cash_0();
void  setup_cash_00();
void  setup_cash_1();
void  enable_reader_vmc();
void  enable_reader_vmc_0();

void  vend_request_0();
void  vend_request_1();
void  vend_request_2();
void  setup_cash_001();

void  start_init();
void  init_ports();
void  init_tmr();
void  init_usart();
void  init_usart_mdb();
void  ack_mdb();
void  set_ok_vend();


//*************************************
void  work_mdb_cash()
//********************

{
  r_a = 0xaa;
test_cashless_1();
//_delay_ms(100);
return;
}

//*************************************

//*************************************
void  test_cashless_1()
//********************
{
  num_cashless = C_CASHLESS_1;
  if (bitRead(flags_vmc1_com,f_reset_cash_vmc) != 0)
  {
    reset_cash();
    return;
  }
  else
  if (bitRead(flags_vmc,f_ok_init_cash1)  ==  0)
  {
    init_mdb_cash();
  }
  else
  if (bitRead(flags_vmc1_com,f_setup_cash_vmc)  !=  0)
  {
    setup_cash();
  }
  else
  if (bitRead(flags_vmc1_com,f_request_vmc) !=  0)
  {
    vend_request();
  }
  else
  if (bitRead(flags_vmc1_com,f_cancel_vmc)  !=  0)
  {
    vend_cancel();
  }
    else
    if (bitRead(flags_vmc1_com,f_success_vmc) !=  0)
    {
      vend_success();
    }
    else
    if (bitRead(flags_vmc1_com,f_failure_vmc) !=  0)
    {
      vend_failure();
    }     
  
    else
    if (bitRead(flags_vmc1_com,f_complete_vmc)  !=  0)
    {
      session_complete();
    }
    else
    if (bitRead(flags_vmc1_com,f_cash_sale_vmc) !=  0)
    {
      cash_sale();
    }
    else
    pool_cashless();
    
}

//*************************************

//*************************************
void  tx_vmc()
//********************
{
  start_com_mdb();
  
}

//*************************************

//*************************************
void  reset_cash()
//********************
{
  
  com_mdb = num_cashless;
  cnt_data_mdb  = 0;
  tx_vmc();
  if (bitRead(flags_mdb,f_end_rx_mdb) != 0)
  {
    pool_cashless();
    bitClear(flags_vmc1_com,f_reset_cash_vmc);
  }
  
  
}

//*************************************
void  pool_cashless()
//********************
{
  pool_cash();
  if (bitRead(flags_mdb,f_end_rx_mdb) != 0)
  {
    test_responce();
  }
}

//*************************************
void  pool_cash()
//********************
{
  //buf_data_rx_mdb[0]  = 0xf0; // ?????? buf_data_tx_mdb[] ????
  com_mdb = (num_cashless+2);
  cnt_data_mdb  = 0;
  tx_vmc();
}
//*************************************
void  test_responce()
//********************
{
      r_a = buf_data_rx_mdb[0];
      //r_a = 0;
      switch(r_a)
      {
        case 0:test_responce_1(); break;
        case 1:test_config_info(); break;
        case 3:test_begin_session(); ack_mdb();break;
        case 4:test_session_cancel();ack_mdb(); break;
        case 5:test_approved();ack_mdb(); break;
        case 6:test_denied(); break;
        case 7:test_end_session(); break;
        case 8:test_cancelled(); break;
        case 9:test_perif_id(); break;
        case 10:test_errors();break;
        case 11:test_err_com();ack_mdb();break;
        default : break;
      }

}

//*************************************
void  test_responce_1()
//********************
{
        //if ((*p) == 2)
        if (cnt_rx_mdb == 2)
        
      {
        ack_mdb();
        bitClear(flags_vmc,f_ok_init_cash1);
        bitClear(flags_vmc1_com,f_reset_cash_vmc);
        
      }
      
}
//*************************************
void  test_config_info()
//********************
{
  for (i=0;i<7;i++)
  {
    *(buf_config_info_cash1+i)   =  *(buf_data_rx_mdb+i);
  }
}
//*************************************
void  test_begin_session()
//********************
{
    for (i=0;i<2;i++)
    {
      *(buf_credit_cash1+i)   = *(buf_data_rx_mdb+i);

    }
    
        //UDR0  = '_';
              // Serial.println("J");   // оплатить картой ( нажали "О")
          // Serial1.println("_");   // оплатить картой ( нажали "О")    
          Serial.println("\nz\n_\nz\n");Serial1.println("\nz\n_\nz\n");delay(1);
          Serial.println("\nz\n_\nz\n");Serial1.println("\nz\n_\nz\n");delay(1);
          Serial.println("\nz\n_\nz\n");Serial1.println("\nz\n_\nz\n");delay(1);
}
//*************************************
void  test_session_cancel()
//********************
{
  bitSet(flags_vmc1_com,f_complete_vmc);
               //Serial.println("W");   // отмена оплаты ( нажали "Х" или закончилось ожидание)
       // UDR3  = 'w';
         //b_price  = 5;
          //set_ok_vend();
         
         
}
//*************************************
void  test_approved()
//********************
{
  bitSet(flags_vmc1_com,f_success_vmc);
  bitSet(flags_vmc1_com,f_complete_vmc);
               //Serial.println("R");   // подтверждение оплаты ( банк подтвердил оплату
          //     UDR3 = 'r';
        //   b_price   = 5;
         set_ok_vend();
}
//*************************************
void  test_denied()
//********************
{
    bitSet(flags_vmc1_com,f_complete_vmc);
              //   Serial.println("Z");   // отказ в оплате ( банк отказал в оплате)
        //         UDR3 = 'z';   
}
//*************************************
void  test_end_session()
//********************
{
  ack_mdb();
}
//*************************************
void  test_cancelled()
//********************
{
  
}
//*************************************
void  test_perif_id()
//********************
{
      for (i=0;i<29;i++)
      {
        *(buf_perif_id_cash1+i)   = *(buf_data_rx_mdb+i);
      }
}
//*************************************
void  test_errors()
//********************
{
  errors_cash1  = *(buf_data_rx_mdb+1);
}
//*************************************
void  test_err_com()
//********************
{
  bitSet(flags_vmc1_com,f_reset_cash_vmc);
}

//*************************************
void  init_mdb_cash()
//********************
{
  expansion_vmc();
  if (bitRead(flags_mdb,f_end_rx_mdb) !=0)
  {
    //ack_mdb();
    desable_reader_vmc();
    if (bitRead(flags_mdb,f_end_rx_mdb) !=0)
    
    {
      setup_cash_0();
      if (bitRead(flags_mdb,f_end_rx_mdb) !=0)
      {
        //ack_mdb();
        setup_cash_1();
        
          if (bitRead(flags_mdb,f_end_rx_mdb) !=0)
          {
              //ack_mdb();
              pool_cash();
            if (bitRead(flags_mdb,f_end_rx_mdb) !=0)
            {
              enable_reader_vmc();
                
              if (bitRead(flags_mdb,f_end_rx_mdb) !=0)    
              {
                pool_cash();
                if (bitRead(flags_mdb,f_end_rx_mdb) !=0)
                {
                  bitSet(flags_vmc,f_ok_init_cash1);
                  
                }
                return;
              }
              return;
                      
            }
            return;
          }
        
        return;
      }
      return;
    }
    return;
  }
  return;
  
}

//*************************************
void  vend_request()
//********************
{ 
  com_mdb = (num_cashless+3);
in_price  = (b_price*1);
in_num    = 1; in_num1=0x00;  
if(b_price>=250){ in_num1=1;in_price=(b_price-256);}
    //UDR3  = 'd';
buf_data_tx_mdb[0]  = 0x00;
buf_data_tx_mdb[1]  = in_num1;
buf_data_tx_mdb[2]  = in_price;
buf_data_tx_mdb[3]  = 0x00; 
buf_data_tx_mdb[4]  = in_num;
cnt_data_mdb  = 5;
tx_vmc();
if (bitRead(flags_mdb,f_end_rx_mdb) !=0)
{
  test_responce();
}
  //if (buf_data_rx_mdb ==  0)
  //{
    bitClear(flags_vmc1_com,f_request_vmc);
  //}

}

//*************************************
void  setup_cash()
//********************
{
  vend_request_0();
if (bitRead(flags_mdb,f_end_rx_mdb) !=0)
  {
    bitClear(flags_vmc1_com,f_setup_cash_vmc);
  }
}

//*************************************
void  vend_cancel()
//********************
{
  buf_data_tx_mdb[0]  = 1;
  r_a = 1;
  vend_request_1();
  
  if (bitRead(flags_mdb,f_end_rx_mdb) !=0)
  {
      bitClear(flags_vmc1_com,f_cancel_vmc);
                              
  }
  
}

//*************************************
void  vend_success()
//********************
{
  buf_data_tx_mdb[0]  = 2;
  buf_data_tx_mdb[1]  = 0;
  buf_data_tx_mdb[2]  = 1;
  r_a = 3;  
      vend_request_1();
      
      if (bitRead(flags_mdb,f_end_rx_mdb) !=0)
      {
        bitClear(flags_vmc1_com,f_success_vmc);
        
      }
  
}

//*************************************
void  vend_failure()
//********************
{
  buf_data_tx_mdb[0]  = 3;  
  r_a = 1;    
    vend_request_1();
    
    if (bitRead(flags_mdb,f_end_rx_mdb) !=0)
    {
      bitClear(flags_vmc1_com,f_failure_vmc);
    }
}

//*************************************
void  session_complete()
//********************
{
  buf_data_tx_mdb[0]  = 4;
    
    r_a = 1;
    vend_request_1();
    
    if (bitRead(flags_mdb,f_end_rx_mdb) !=0)
    {
      if (buf_data_rx_mdb[0] == 0)
      {
            bitClear(flags_vmc1_com,f_complete_vmc);
             
  
      }
    }
  //return; 
}
//  (uint8_t *)u++;
//*************************************
void  cash_sale()
//********************
{
  u = &buf_cash_sale;
  vend_request_0();
    if (bitRead(flags_mdb,f_end_rx_mdb) !=0)
    {
      bitClear(flags_vmc1_com,f_cash_sale_vmc);
    } 
  
}
//*************************************
void  expansion_vmc()
//********************
{
  u = &buf_expansion;
  r_a = (num_cashless+7);
  setup_cash_001();
}
//*************************************
void  desable_reader_vmc()
//********************
{
  r_a = 0;
  enable_reader_vmc_0();  
}

//*************************************
void  setup_cash_0()
//********************
{
  u = &buf_setup_0;
  setup_cash_00();
}
//*************************************
void  setup_cash_00()
//********************
{
  r_a = (num_cashless + 1);
  setup_cash_001();
}

//*************************************
void  setup_cash_1()
//********************
{
  u =  &buf_setup_1;
  setup_cash_00();
}

//*************************************
void  enable_reader_vmc()
//********************
{
  r_a = 1;
  enable_reader_vmc_0();
}
//*************************************
void  enable_reader_vmc_0()
//********************
{
  buf_data_tx_mdb[0]  = r_a;
  cnt_data_mdb  = 1;
  r_a = (num_cashless+4);
  vend_request_2();
}


//*************************************
void  vend_request_0()
//********************
{
  r_a = (num_cashless+3);
  setup_cash_1();
}
//*************************************
void  vend_request_1()
//********************
{
  cnt_data_mdb  = r_a;
  r_a = num_cashless+3;
  vend_request_2();
}
//*************************************
void  vend_request_2()
//********************
{
  com_mdb = r_a;
  tx_vmc();
  if (bitRead(flags_mdb,f_end_rx_mdb) !=0)
  {
    test_responce();
  } 
}
//*************************************
void    setup_cash_001()
//********************
{
  com_mdb = r_a;
    r_a = *(int*)u;
    u++;
    cnt_data_mdb  = r_a;
    for (i=0;i<r_a;i++)
    {
      *(buf_data_tx_mdb+i)  = *(uint8_t*)u;
      u++;
    }
      tx_vmc();
      if (bitRead(flags_mdb,f_end_rx_mdb) !=0)
      {
        test_responce();
      } 
    
    
}

//************************************************
void  test_mdb()
//************************************************
{
  
if (bitRead (flags_mdb,f_to_mdb) != 0)
{

work_mdb_cash();
to_s_mdb  = 0x70;
bitClear (flags_mdb,f_to_mdb);
}
return;
}

//************************************************
//void  init_t_mdb()
//************************************************

//{
  
//}

//************************************************
void  start_com_mdb()
//************************************************
{
  cnt_tx_mdb  = 0;
  UCSR2B  = 0x0d;
  //delay(1);
  _delay_ms(1);
  check_mdb = com_mdb;
  r_a = com_mdb;
  wait_tx_mdb();
  UCSR2B  = 0x0c; 
  _delay_ms(1);
  while (cnt_data_mdb !=  0)
  {
    cnt_data_mdb--  ;
    r_a = *(buf_data_tx_mdb + cnt_tx_mdb);
    cnt_tx_mdb++;
    check_mdb = check_mdb + r_a;  
    wait_tx_mdb();
    
  }
  
  
  trans_ks();
  
  
}
//***************************************************************
void  ack_mdb()
//**************************
{
  r_a = 0;
  wait_tx_mdb();
}

//************************************************
void  trans_ks()
//************************************************
{
    r_a = check_mdb;
    wait_tx_mdb();
    wait_rx_mdb();
    return;
}

//************************************************
void  wait_tx_mdb()
//************************************************
{
    UDR2  = r_a;
    //UDR3  = r_a;
    
    while (bitRead (UCSR2A,TXC2) == 0)
    {
      
    }
    
    bitSet  (UCSR2A,TXC2);
  
  
}

//************************************************
void  wait_rx_mdb()
//************************************************
{
    cnt_data_mdb  = 0;
    cnt_rx_mdb  = 0;

    to_s_mdb  = 0x20;
    UCSR2B  = 0x9c;
    //_delay_ms(1);
        //bitClear  (flags_mdb,(f_err_ans_mdb|f_not_ans_mdb|f_to_mdb|f_end_rx_mdb));
        flags_mdb =(flags_mdb & 0x4d);
TCNT4H  = C_TH4;
TCNT4L  = C_TL4;
TCCR4B  = C_TCCR4B;

while(bitRead(flags_mdb,f_end_rx_mdb)==0){ 
  if(bitRead(flags_mdb,f_to_mdb)!=0){ya=ya+1;bitSet(flags_mdb,f_err_ans_mdb);bitClear(flags_mdb,f_to_mdb);return;}
  if(ya>=30){ya=0;reset_cash();}
  }
    
//    ack_mdb();
}




//************************************************
void  init_usart_mdb()
//************************************************
{
  UCSR2A  = 0;
  UCSR2B  = 0x1c; //
  UCSR2C  = 0X06; //  
  UBRR2H  = 0;  //
  UBRR2L  = 103;  // 

  UCSR3A  = 0;
  UCSR3B  = 0x98; // ����. �� ��.\ ����.��.\����.���.\9���
  UCSR3C  = 0X06; //  9 ��� , 1 ���� ��� , ������.
  UBRR3H  = 0;  //
  UBRR3L  = 52; // 
  
  
  UCSR0A  = 0;
  UCSR0B  = 0x08; // ����. �� ��.\ ����.��.\����.���.\8���
  UCSR0C  = 0X06; //  9 ��� , 1 ���� ��� , ������.
  UBRR0H  = 0;  //
  UBRR0L  = 52; // ����� 16.0 MHg  9600
  
}

//************************************************
ISR (TIMER4_OVF_vect) //
//************************************************
{
  to_s_mdb--;
  if  (to_s_mdb  ==  0)
  {
  bitSet  (flags_mdb,f_to_mdb);
  }
}

//**************************************************************************
void  init_ports()
//*******************
{
  
  PORTA = 0xff;
  DDRA  = 0x00;
  
  PORTB = 0x09;
  DDRB  = 0xf6;
  
  PORTC = 0xff;
  DDRC  = 0x00;
  
  PORTD = 0xf7;
  DDRD  = 0x08;
  
  PORTE = 0xfd;
  DDRE  = 0x02;

  PORTF = 0xfb;
  DDRF  = 0x04;

  PORTG = 0xdf;
  DDRG  = 0x20;

  PORTH = 0x85;
  DDRH  = 0x7a;
  
  PORTJ = 0xfd;
  DDRJ  = 0x02;
  
  PORTK = 0xb6;
  DDRK  = 0x49;

  PORTL = 0xff;
  DDRL  = 0x00;

}

//**************************************************************************
void  init_tmr()
//*****************
{
//  INIT_TMR1:
TCNT1H  = C_TH1;
TCNT1L  = C_TL1;
TCCR1B  = C_TCCR1B;
//bitSet(TIMSK1,TOIE1);

//  INIT_TMR3:
TCNT3H  = C_TH3;
TCNT3L  = C_TL3;
TCCR3B  = C_TCCR3B;
//bitSet(TIMSK3,TOIE3);

//  INIT_TMR4:
TCNT4H  = C_TH4;
TCNT4L  = C_TL4;
TCCR4B  = C_TCCR4B;
bitSet(TIMSK4,TOIE4);

//  INIT_TMR5:
TCNT5H  = C_TH5;
TCNT5L  = C_TL5;
TCCR5B  = C_TCCR5B;
//bitSet(TIMSK5,TOIE5);
}

//**************************************************************************
void  init_usart()
//*******************
{
  init_usart_mdb(); 
//INIT_USART0:
/*
  UCSR0A  = 0x00;
  UCSR0B  = 0x98;   
  UCSR0C  = 0x06;
  UBRR0H  = 0x00;   
  UBRR0L  = 103 ; //�������� 9600 ���;����� 16MHg
*/
//INIT_USART1:  
/*
  UCSR1A  = 0x00;
  UCSR1B  = 0x98;   
  UCSR1C  = 0x06;
  UBRR1H  = 0x00;   
  UBRR1L  = 103 ; //�������� 9600 ���;����� 16MHg
*/  
//INIT_USART2:
/*
  UCSR2A  = 0x00;
  UCSR2B  = 0x98;   
  UCSR2C  = 0x06;
  UBRR2H  = 0x00;   
  UBRR2L  = 103 ; //�������� 9600 ���;����� 16M
  */
//INIT_USART3:
/*
  UCSR3A  = 0x00;
  UCSR3B  = 0x98;   
  UCSR3C  = 0x06;
  UBRR3H  = 0x00;   
  UBRR3L  = 103 ; //�������� 9600 ���;����� 16MHg
  */

}

//**************************************************************************
void  start_init()
//*******************
{
  //init_ports();
  _delay_ms(30);
  init_tmr();
  init_usart();
  bitSet(flags_vmc1_com,f_reset_cash_vmc);
  sei();
}

/*
//************************************************
ISR(USART0_RX_vect)  // ���������� �� USART2
//************************************************
{

  in_test_mdb = UCSR0B;
  in_rx_usart0 = UDR0;
  bitSet(flags_vmc1_com,f_request_vmc);
  
  //UDR3  = in_rx_usart0;

}
*/
//************************************************
ISR(USART2_RX_vect) // ���������� �� USART2
//************************************************
{
  TCNT3H  = 0x80; //
  TCNT3L  = 0;  //
  in_test_mdb = UCSR2B;
  in_rx_mdb = UDR2;
  ///////UDR3  = in_rx_mdb;

    
  
  *(buf_data_rx_mdb+cnt_rx_mdb)  = in_rx_mdb;  // IN RX3
  cnt_rx_mdb++;           // ������� �������� ����
  
  
  if (bitRead (in_test_mdb,RXB82) != 0)
  {
      *p  = cnt_rx_mdb;
    bitSet(flags_mdb,f_end_rx_mdb);
  
  }
  
      //return;
      
}

//*************************************
void  set_ok_vend()
//********************
{

  for (int i = 0; i < in_price; i=i+10) {  // Serial.println("\nz\nd\nz\n");Serial1.println("\nz\nd\nz\n");
  } 
    if(in_price>0){Serial.println("\nz\n/\nz\n");Serial1.println("\nz\n/\nz\n");  }in_price=0;  bitSet (flags_tek_kkt,f_cashless);
  
  //  for (int i = 0; i < b_price; i++)
    
 //   {
 //     Serial1.println("c");
      //UDR3  = 'c';
 //   }
  
  return;
}

От службы поддержки пришли вот эти логи: 
 
Пример лога стандартной инициализации по MDB:
Sep 30 19:33:28 jibe user.info EftVending[1658]: put: [46087][VMC][OUT] : 00
Sep 30 19:33:29 jibe user.info EftVending[1658]: performIO: [47012][VMC][IN] : ACK after 1 attempts
Sep 30 19:33:29 jibe user.info EftVending[1658]: performIO: [47013][VMC][IN] : 110003000000
Sep 30 19:33:30 jibe user.info EftVending[1658]: put: [48342][VMC][OUT] : 0103FFFF01007809
Sep 30 19:33:31 jibe user.info EftVending[1658]: performIO: [48380][VMC][IN] : 1101FFFF0000
Sep 30 19:33:31 jibe user.info EftVending[1658]: performIO: [48673][VMC][IN] : ACK after 1 attempts
Sep 30 19:33:31 jibe user.info EftVending[1658]: performIO: [49215][VMC][IN] : 17004D45493030303030303030303030304E4743204D444220303030310127
Sep 30 19:33:32 jibe user.info EftVending[1658]: put: [49537][VMC][OUT] : 0956444B37303030303030303534353956656E646F74656B322E3520004300000020
Sep 30 19:33:32 jibe user.info EftVending[1658]: performIO: [50016][VMC][IN] : ACK after 1 attempts
Sep 30 19:33:33 jibe user.info EftVending[1658]: performIO: [50522][VMC][IN] : 170400000020
Sep 30 19:33:34 jibe user.info EftVending[1658]: performIO: [51751][VMC][IN] : 1401
 
 
Лог вашей инициализации:
Nov  4 19:06:46 jibe user.info EftVending[1588]: put: [25352][VMC][OUT] : 00
Nov  4 19:06:46 jibe user.info EftVending[1588]: put: [25492][VMC][OUT] : 00
Nov  4 19:06:47 jibe user.info EftVending[1588]: performIO: [26963][VMC][IN] : ACK after 1 attempts
Nov  4 19:06:47 jibe user.info EftVending[1588]: performIO: [26969][VMC][IN] : 17004956543030303030303030303132332030303030303030303034353101
Nov  4 19:06:48 jibe user.info EftVending[1588]: put: [27616][VMC][OUT] : 0956444B37303030303030303933353556656E646F74656B322E35200045
Nov  4 19:06:48 jibe user.info EftVending[1588]: performIO: [27704][VMC][IN] : 1400
Nov  4 19:06:49 jibe user.info EftVending[1588]: performIO: [28100][VMC][IN] : 110001000007
Nov  4 19:06:49 jibe user.info EftVending[1588]: put: [28572][VMC][OUT] : 0101FFFF01007809
Nov  4 19:06:49 jibe user.info EftVending[1588]: performIO: [28624][VMC][IN] : 110101F40032
Nov  4 19:06:50 jibe user.info EftVending[1588]: performIO: [29116][VMC][IN] : 1401
Nov  4 19:06:53 jibe user.info EftVending[1588]: performIO: [32277][VMC][IN] : 17004956543030303030303030303132332030303030303030303034353101
Nov  4 19:06:53 jibe user.info EftVending[1588]: put: [32433][VMC][OUT] : 0956444B37303030303030303933353556656E646F74656B322E35200045
Nov  4 19:06:53 jibe user.info EftVending[1588]: performIO: [32536][VMC][IN] : 1400
Nov  4 19:06:54 jibe user.info EftVending[1588]: performIO: [33179][VMC][IN] : 110001000007
Nov  4 19:06:54 jibe user.info EftVending[1588]: put: [33871][VMC][OUT] : 0101FFFF01007809
Nov  4 19:06:55 jibe user.info EftVending[1588]: performIO: [34050][VMC][IN] : 110101F40032
Nov  4 19:06:55 jibe user.info EftVending[1588]: performIO: [34844][VMC][IN] : 1401
Nov  4 19:07:01 jibe user.info EftVending[1588]: performIO: [40187][VMC][IN] : 10
Nov  4 19:07:01 jibe user.info EftVending[1588]: put: [40424][VMC][OUT] : 00
Nov  4 19:07:02 jibe user.info EftVending[1588]: performIO: [41387][VMC][IN] : 10
Nov  4 19:07:03 jibe user.info EftVending[1588]: performIO: [42101][VMC][IN] : ACK after 1 attempt 
 

 

 

b707
Offline
Зарегистрирован: 26.05.2017

Очень мало информации. Что за ошибка в инициализации? - предлагаете искать вслепую в сотнях строк кода?

Что за ардуино? пять таймеров. три Сериал? - Мега?

Ну и потом, это хоббийный сайт. А торговый автомат - это бизнес. Такие услуги оказываются только платно. Служба поддержки, я так понял, помогать вам не хочет. А мы почему должны?

 

sadman41
Offline
Зарегистрирован: 19.10.2016

B707, а для чего ещё форумы нужны? Для этого.

Пока ты чай на работе пьешь, форум за тебя ошибки в исходниках ищет. Найдет, все расскажет-исправит, ты клиенту проект сдашь, денежку получишь и красавчик со всех сторон.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Так и запишем, Ошибка в ДНК вопрошающего. 

Kabasya
Offline
Зарегистрирован: 20.05.2018

Это проект не для клиента 

это мой терминал который работает в моей прачечной

запарился уже с этим банковским терминалом 

Ардуино Мега 

Сюда пишу потому что уже сам не знаю где искать 

поддержка помогать не хочет ...

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Если не можешь справиться с бешенной кобылой - продай ее и живи спокойно.

imp
Offline
Зарегистрирован: 20.06.2020

Kabasya пишет:

...поддержка помогать не хочет ...

А весьма верояно, что и не может. Подключите параллельно терминалу к выходу и выходу Вашего устройства два входа RS232 компьютера, и просматривайте передаваемые запросы и ответы на них, сравнивая их с даташитом на устройство. Правьте программу устраняя отличия.

Возможно, что отличий не будет (маловероятно, но в принципе возможно) тогда возьмите программу для работы с терминалом, и точно так же снифайте сравнивая с даташитом. Различия перенесите в свою программу.

b707
Offline
Зарегистрирован: 26.05.2017

Kabasya пишет:

Это проект не для клиента 

это мой терминал который работает в моей прачечной

То есть прачечная - это не бизнес?

Ваша личная стиральная машина оборудована банковским терминалом? А деньги с кого берете, с жены?

Kabasya
Offline
Зарегистрирован: 20.05.2018

решение найдено 

более не актуально 

 

 

 

Kabasya
Offline
Зарегистрирован: 20.05.2018

прошу удалить тему 

SAB
Offline
Зарегистрирован: 27.12.2016

Год назад запускал вендотековские терминалы по COM порту. Все прекрасно работало. Правда приемник В конечном итоге просто перешли на пульс и без всяких контроллеров втыкаем вместо купюрника

Idex
Offline
Зарегистрирован: 30.08.2021

Sab, здравствуйте, у меня сейчас похожая задача стоит, нужно подружить Ардуино и вендотек, вы могли мне помочь за оплату, свяжитесь со мной по почте mbmb0mbmb0@yandex.ru, пожалуйста.

Idex
Offline
Зарегистрирован: 30.08.2021

Спасибо

SAB
Offline
Зарегистрирован: 27.12.2016

то Idex: За пару лет работы с Vendotek пришли к выводу, что легче с ним работать по протоколу пульс. Он работает точно так же как обычный купюрник ICT V7,  причем вешается параллельно выходу купюрнтка. И там и там, выход на открытый коллектор. Стоимость импульса можно задавать через обновления прошивки через сервис Vendotek или через банк. Если вешаете на один канал с кпюрником то 1 импульс = 10 рублям. Физически, питание +12 вольт подаете на ХР2 контакт 1 GND-контакт 2 Импульсы снимаете с XP1 с контакта 11 (IO1/COIN OUT1). Скважность импульса так же можно задать программно, но обычно 50 мс 50%

SAB
Offline
Зарегистрирован: 27.12.2016

Divinorum
Offline
Зарегистрирован: 10.09.2021

Sab, здравствуйте, прошу вас помочь разобраться с работой вендотек по com порту, прошу связаться со мной dm-iv@bk.ru Отблагодарю финансово за помощь. С пульсом все понятно, я не могу разобраться с работой по протоколу vtk. 

SAB
Offline
Зарегистрирован: 27.12.2016

#include <SoftwareSerial.h>
SoftwareSerial posSerial(9, 10); // RX, TX
uint16_t i, tmp, crc = 0xffff;
int a=0;//CRC0
int b=0;//CRC1
int l=0;//Количество переданных знаков
int ll=0;//Количество переданных знаков
int z=0;
uint8_t data[50];//приходящий код от терминала
uint8_t data1 []={0x1F,0x00,0x1D,0x96,0xFB,0x01,0x03,0x56,0x52,0x50,0x03,0x08,  0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,    0x04,0x05,   0x30,0x30,0x31,   0x30,0x30,0x06,0x03,0x31,0x32,0x30,   0x5C,0x99};//Передача кода на терминал с суммойоб оплате
//                  0    1    2    3    4    5    6    7    8    9    10   11     12   13   14   15   16   17   18   19       20   21      22   23   24      25   26   27   28   29   30   31      32   33   
uint8_t data2 [21];//Сумма оплаты
uint8_t data3 []={0x1F,0x00,0x0A,0x96,0xFB,0x01,0x03,0x49,0x44,0x4C,0x03,0x01,0x30,0xB6,0x49}; //Начальная инициализация терминала
//                  0    1    2    3    4    5    6    7    8    9    10   11   12   13   14
uint8_t data4 []={0x1F,0x00,0x18,0x96,0xFB,0x01,0x03,0x46,0x49,0x4E,0x03,0x08,  0x30,0x30,0x30,0x30,0x30,0x30,0x35,0x30,    0x04,0x05,   0x30,0x30,0x31,   0x30,0x30,0x34,0x51};//Финализируем документ
//                  0    1    2    3    4    5    6    7    8    9    10   11     12   13   14   15   16   17   18   19       20   21      22   23   24      25   26   27   28  
uint8_t data5 []={0x1F,0x00,0x11,0x96,0xFB,0x01,0x03,0x49,0x44,0x4C,0x03,0x08,  0x30,0x30,0x30,0x30,0x30,0x30,0x35,0x31,    0xFF,0x2C};//Последующая инициализация терминала
//                  0    1    2    3    4    5    6    7    8    9    10   11     12   13   14   15   16   17   18   19       20   21        

long previousMillis = 0; // время, когда состояние обновлялось
long interval = 120000; //delay (1000)


//const uint8_t 
int sp = 50;//Задержка СОМ порта при чтении
int c = 0; //Количество знаков в документе
int c1 = 0;
int c2 = 0;//признак прохождения платежа если с2==1 платеж не прошел
int n[10]; //номер документа
int n1 = 0;
int n2 = 0;
int n3 = 0;
int n4 = 0;
int n5 = 0;
int n6 = 0;
int n7 = 0;
int n8 = 0;
int n9 = 0;
int n10 = 0;
int n11 = 0;
int n12 = 0;
int n13 = 0;
int n14 = 0;
int n15 = 0;
int n16 = 0;


static const uint16_t crc16_ccitt_table[ 256 ] =
{
    0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
    0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
    0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
    0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
    0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
    0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
    0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
    0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
    0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
    0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
    0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
    0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
    0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
    0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
    0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
    0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
    0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
    0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
    0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
    0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
    0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
    0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
    0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
    0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
    0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
    0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
    0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
    0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
    0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
    0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
    0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
    0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0};

void setup() {
      Serial.begin(115200);   
      posSerial.begin(19200);

for ( i = 0; i < 22 ; i++ ){Serial.write (data5[i]);}//Посылаем запрос на терминал
//delay(500);
set1:
delay(500);
  if(Serial.available()==0){goto set1;}

 c1=Serial.available();
    for ( i = 0; i < c1 ; i++ ){data[i]=Serial.read();} //читаем ответ терминала
for ( i = 0; i < c1 ; i++ ){posSerial.write (data[i]);}
 }
//-------------------------------------------------------------------------------------------------
void loop (){
 l1: 
  if(posSerial.available()!=0){if(posSerial.read()==0x1F){goto lps;}}//Проверяем 4 (1F 31 30 30 байта суммы оплаты от терминала оплаты


//=====================================================================================================
//Поддержание терминала в активном режиме кнопки (засыпает через 5 минут) interval==120 секунды==2мин 0сек
  if (millis() - previousMillis > interval) {//Не даем терминалу заснуть (выходить на надпись "Карты не принимаются...
    previousMillis = millis();   // запоминаем текущее время
  for ( i = 0; i < 22 ; i++ ){Serial.write (data5[i]);}//Посылаем запрос на терминал
set10:
delay(500);
  if(Serial.available()==0){goto set10;}

 c1=Serial.available();
    for ( i = 0; i < c1 ; i++ ){data[i]=Serial.read();} //читаем ответ терминала
}
//=====================================================================================================

delay(500);
  if(Serial.available()==0){goto l1;}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 c1=Serial.available();

    for ( i = 0; i < c1 ; i++ ){data[i]=Serial.read();} //читаем ответ терминала

 if(data[0]==0x1F && data[1]==0x00 && data[2]==0x07 && data[3]==0x97 && data[4]==0xFB){ 
 for ( i = 0; i < 5 ; i++ ){posSerial.write (data[i]);}//посылаем на комп данную последовательность

 delay(500);
for ( i = 0; i < 50 ; i++ ){data[i]=posSerial.read();} //очищаем порт

  goto l2;}  // Проверяем посылку от кнопки терминала 1F 00 07 97 FB 01 03 53 54 41 9F 53
  goto l1;     

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    
l2:
delay(500);
  if(posSerial.available()==0){goto l2;}//Ждем 3 байта суммы оплаты от бокса

 
    c1=posSerial.available();

lps:

for ( i = 0; i < 3 ; i++ ){data1[22+i]=posSerial.read();} //читаем сумму для оплаты
for ( i = 0; i < 8 ; i++ ){data1[12+i]=0x30;}// Обнуляем номер документа
//for ( i = 0; i < c1 ; i++ ){data[i]=posSerial.read();} //обнуляем порт

//for ( i = 0; i < 5 ; i++ ){posSerial.write (data[i]);}//Посылаем на контроллер готовность прнять данные

ZND();//запрос номера текущего документа у терминала
for ( i = 0; i < 22 ; i++ ){Serial.write (data5[i]);}//Посылаем запрос IDL на терминал
set2:
delay(500);
  if(Serial.available()==0){goto set2;}

 c1=Serial.available();
    for ( i = 0; i < c1 ; i++ ){data[i]=Serial.read();} //читаем ответ терминала

 }//end loop
//----------------------------------------------
//Запрос номера текущего документа
void ZND (){//1F 00 0A 96 FB 01 03 49 44 4C 03 01 30 B6 49

z1:
for ( i = 0; i < 22 ; i++ ){Serial.write (data5[i]);}//Посылаем запрос IDL на терминал
z0:
delay(500);
if(Serial.available()==0){goto z0;}
l= Serial.available();
for ( i = 0; i < l ; i++ ){data[i]=Serial.read();} //читаем ответ терминала

for ( i = 0; i < data[11] ; i++ ){n[i]=data[12+i];}//вычисляем номер текущего документа в терминале 
if (data[11]==0x01) {if (n[0]==0x39)                                                                                           {data1[19]=0x30;data1[18]=0x31;}                                                                                           else {data1[19]=(n[0]+0x01);                                                                                                         if (data1[19]==0x3A) {data1[19]=0x30; data1[18]= n[0]+0x01;}}}
if (data[11]==0x02) {if (n[0]==0x39 & n[1]==0x39)                                                                              {data1[19]=0x30;data1[18]=0x30;data1[17]=0x31;}                                                                            else {data1[19]=(n[1]+0x01);data1[18]=n[0];                                                                                          if (data1[19]==0x3A) {data1[19]=0x30; data1[18]= n[0]+0x01;}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       else {data1[18]=n[0];}}}
if (data[11]==0x03) {if (n[0]==0x39 & n[1]==0x39 & n[2]==0x39)                                                                 {data1[19]=0x30;data1[18]=0x30;data1[17]=0x30;data1[16]=0x31;}                                                             else {data1[19]=(n[2]+0x01);data1[18]=n[1];data1[17]=n[0];                                                                           if (data1[19]==0x3A) {data1[19]=0x30; data1[18]= n[1]+0x01;data1[17]=n[0];                                                                            if(data1[18]==0x3A){data1[18]=0x30;data1[17]=n[0]+0x01;}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     else {data1[17]=n[0];}}}}
if (data[11]==0x04) {if (n[0]==0x39 & n[1]==0x39 & n[2]==0x39 & n[3]==0x39)                                                    {data1[19]=0x30;data1[18]=0x30;data1[17]=0x30;data1[16]=0x30;data1[15]=0x31;}                                              else {data1[19]=(n[3]+0x01);data1[18]=n[2];data1[17]=n[1];data1[16]=n[0];                                                            if (data1[19]==0x3A) {data1[19]=0x30; data1[18]= n[2]+0x01;data1[17]=n[1];data1[16]=n[0];                                                             if(data1[18]==0x3A){data1[18]=0x30;data1[17]=n[1]+0x01;data1[16]=n[0];                                                             if (data1[17]==0x3A) {data1[17]=0x30;data1[16]=n[0]+0x01;}                                                                                                                                                                                                                                                                                                                                                                                                else {data1[16]=n[0];}}}}}
if (data[11]==0x05) {if (n[0]==0x39 & n[1]==0x39 & n[2]==0x39 & n[3]==0x39 & n[4]==0x39)                                       {data1[19]=0x30;data1[18]=0x30;data1[17]=0x30;data1[16]=0x30;data1[15]=0x30;data1[14]=0x31;}                               else {data1[19]=(n[4]+0x01);data1[18]=n[3];data1[17]=n[2];data1[16]=n[1];data1[15]=n[0];                                             if (data1[19]==0x3A) {data1[19]=0x30; data1[18]= n[3]+0x01;data1[17]=n[2];data1[16]=n[1];data1[15]=n[0];                                              if(data1[18]==0x3A){data1[18]=0x30;data1[17]=n[2]+0x01;data1[16]=n[1];data1[15]=n[0];                                              if (data1[17]==0x3A) {data1[17]=0x30;data1[16]=n[1]+0x01;data1[15]=n[0];                                             if (data1[16]==0x3A) {data1[16]=0x30;data1[15]=n[0]+0x01;}                                                                                                                                                                                                                                                                           else {data1[15]=n[0];}}}}}}
if (data[11]==0x06) {if (n[0]==0x39 & n[1]==0x39 & n[2]==0x39 & n[3]==0x39 & n[4]==0x39 & n[5]==0x39)                          {data1[19]=0x30;data1[18]=0x30;data1[17]=0x30;data1[16]=0x30;data1[15]=0x30;data1[14]=0x30;data1[13]=0x31;}                else {data1[19]=(n[5]+0x01);data1[18]=n[4];data1[17]=n[3];data1[16]=n[2];data1[15]=n[1];data1[14]=n[0];                              if (data1[19]==0x3A) {data1[19]=0x30; data1[18]= n[4]+0x01;data1[17]=n[3];data1[16]=n[2];data1[15]=n[1];data1[14]=n[0];                               if(data1[18]==0x3A){data1[18]=0x30;data1[17]=n[3]+0x01;data1[16]=n[2];data1[15]=n[1];data1[14]=n[0];                               if (data1[17]==0x3A) {data1[17]=0x30;data1[16]=n[2]+0x01;data1[15]=n[1];data1[14]=n[0];                              if (data1[16]==0x3A) {data1[16]=0x30;data1[15]=n[1]+0x01;data1[14]=n[0];                                if (data1[15]==0x3A) {data1[15]=0x30;data1[14]=n[0]+0x01;}                                                                                                                                                                   else {data1[14]=n[0];}}}}}}}
if (data[11]==0x07) {if (n[0]==0x39 & n[1]==0x39 & n[2]==0x39 & n[3]==0x39 & n[4]==0x39 & n[5]==0x39 & n[6]==0x39)             {data1[19]=0x30;data1[18]=0x30;data1[17]=0x30;data1[16]=0x30;data1[15]=0x30;data1[14]=0x30;data1[13]=0x30;data1[12]=0x31;} else {data1[19]=(n[6]+0x01);data1[18]=n[5];data1[17]=n[4];data1[16]=n[3];data1[15]=n[2];data1[14]=n[1];data1[13]=n[0];               if (data1[19]==0x3A) {data1[19]=0x30; data1[18]= n[5]+0x01;data1[17]=n[4];data1[16]=n[3];data1[15]=n[2];data1[14]=n[1];data1[13]=n[0];                if(data1[18]==0x3A){data1[18]=0x30;data1[17]=n[4]+0x01;data1[16]=n[3];data1[15]=n[2];data1[14]=n[1];data1[13]=n[0];                if (data1[17]==0x3A) {data1[17]=0x30;data1[16]=n[3]+0x01;data1[15]=n[2];data1[14]=n[1];data1[13]=n[0];               if (data1[16]==0x3A) {data1[16]=0x30;data1[15]=n[2]+0x01;data1[14]=n[1];data1[13]=n[0];                 if (data1[15]==0x3A) {data1[15]=0x30;data1[14]=n[1]+0x01;data1[13]=n[0];               if (data1[14]==0x3A) {data1[14]=0x30;data1[13]=n[0]+0x01;}                                                                            else {data1[13]=n[0];}}}}}}}}
if (data[11]==0x08) {if (n[0]==0x39 & n[1]==0x39 & n[2]==0x39 & n[3]==0x39 & n[4]==0x39 & n[5]==0x39 & n[6]==0x39 & n[7]==0x39){data1[19]=n[7];data1[18]=n[6];data1[17]=n[5];data1[16]=n[4];data1[15]=n[3];data1[14]=n[2];data1[13]=n[1];data1[12]=n[0];} else {data1[19]=(n[7]+0x01);data1[18]=n[6];data1[17]=n[5];data1[16]=n[4];data1[15]=n[3];data1[14]=n[2];data1[13]=n[1];data1[12]=n[0];if (data1[19]==0x3A) {data1[19]=0x30; data1[18]= n[6]+0x01;data1[17]=n[5];data1[16]=n[4];data1[15]=n[3];data1[14]=n[2];data1[13]=n[1];data1[12]=n[0]; if(data1[18]==0x3A){data1[18]=0x30;data1[17]=n[5]+0x01;data1[16]=n[4];data1[15]=n[3];data1[14]=n[2];data1[13]=n[1];data1[12]=n[0]; if (data1[17]==0x3A) {data1[17]=0x30;data1[16]=n[4]+0x01;data1[15]=n[3];data1[14]=n[2];data1[13]=n[1];data1[12]=n[0];if (data1[16]==0x3A) {data1[16]=0x30;data1[15]=n[3]+0x01;data1[14]=n[2];data1[13]=n[1];data1[12]=n[0];  if (data1[15]==0x3A) {data1[15]=0x30;data1[14]=n[2]+0x01;data1[13]=n[1];data1[12]=n[0];if (data1[14]==0x3A) {data1[14]=0x30;data1[13]=n[1]+0x01;data1[12]=n[0];if (data1[13]==0x3A) {data1[13]=0x30;data1[12]=n[0]+0x01;}    else {data1[12]=n[0];}}}}}}}}}

cr1();//Вычисляем контрольную сумму

z3:
for ( i = 0; i < 34 ; i++ ){Serial.write (data1[i]);}//Посылаем сумму на терминал
//--------------------------------------------------------------------------------------------------
//Ожидаем ответ банка по принятой или отклоненной транзакции
z4:
delay(500);
if(Serial.available()==0){goto z4;}
l= Serial.available();
for ( i = 0; i < l ; i++ ){data[i]=Serial.read();} //читаем ответ терминала
for ( i = 0; i < l ; i++ ){if(data[i]==0x04){c2=data[i+1];}}//проверяем результат транзакции если с2==0х01 платеж отклонен банком
if (c2!=0x01){c2=0x05;}
posSerial.write (0x1F);
posSerial.write (c2); //Посылаем признак принятой (с2==0х05) или отклоненной (с2==0х01) транзакции с банком

}
//-------------------------------------------
//Программа вычисления CRC16 CCITT-FALSE для 
//передачи на терминал
void cr1(){
crc = 0xffff; 
for ( i = 0; i < 32 ; i++ ){ //sizeof(data)
tmp =(crc >> 8)^(0x00ff & data1[i]);
crc = ( crc << 8 ) ^ crc16_ccitt_table[ tmp ];
}
data1[32]= ( ( crc >> 8 ) & 0xFF);
data1[33]= ( crc & 0xFF);
}

Это работало на Vendotek 1. Наверняка, что то пригодится. Тот же алгоритм вычисления CRC остался тот же. Atmega328 работала на этом скетче. Я уже не буду вспоминать, что и как там по алгоритмам, разбирайтесь сами, там некоторые пояснения есть. Договоритесь с вендотеком, чтобы вам прошили ваш присланный им терминал прошивкой для интеграции. Потому что по воздуху они не шьют данную прошивку. Когда получите данный терминал, то у вас появится возможность без связи с банком, прикладывая карту получать валидную транзакцию без снятия средств с карты. Только так вы сможете у себя откатать данный протокол. Всё чем мог , я помог. Больше не просите меня, даже за деньги, вернуться к этому проекту.

Divinorum
Offline
Зарегистрирован: 10.09.2021

Огромное спасибо 

Naparnik
Offline
Зарегистрирован: 30.03.2022

Здравствуйте. Как решили проблему? Нашли ошибки в коде? Хотелось бы пообщаться на данную тему s_shershnev@mail.ru