MDB ARDUINO + банковский терминал VENDOTEK 3
- Войдите на сайт для отправки комментариев
Чт, 05/11/2020 - 16:23
Добрый день !
Может кто сталкивался с подключение банковского терминала 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, а для чего ещё форумы нужны? Для этого.
Пока ты чай на работе пьешь, форум за тебя ошибки в исходниках ищет. Найдет, все расскажет-исправит, ты клиенту проект сдашь, денежку получишь и красавчик со всех сторон.
Так и запишем, Ошибка в ДНК вопрошающего.
Это проект не для клиента
это мой терминал который работает в моей прачечной
запарился уже с этим банковским терминалом
Ардуино Мега
Сюда пишу потому что уже сам не знаю где искать
поддержка помогать не хочет ...
Если не можешь справиться с бешенной кобылой - продай ее и живи спокойно.
...поддержка помогать не хочет ...
А весьма верояно, что и не может. Подключите параллельно терминалу к выходу и выходу Вашего устройства два входа RS232 компьютера, и просматривайте передаваемые запросы и ответы на них, сравнивая их с даташитом на устройство. Правьте программу устраняя отличия.
Возможно, что отличий не будет (маловероятно, но в принципе возможно) тогда возьмите программу для работы с терминалом, и точно так же снифайте сравнивая с даташитом. Различия перенесите в свою программу.
Это проект не для клиента
это мой терминал который работает в моей прачечной
То есть прачечная - это не бизнес?
Ваша личная стиральная машина оборудована банковским терминалом? А деньги с кого берете, с жены?
решение найдено
более не актуально
прошу удалить тему
Год назад запускал вендотековские терминалы по COM порту. Все прекрасно работало. Правда приемник В конечном итоге просто перешли на пульс и без всяких контроллеров втыкаем вместо купюрника
Sab, здравствуйте, у меня сейчас похожая задача стоит, нужно подружить Ардуино и вендотек, вы могли мне помочь за оплату, свяжитесь со мной по почте mbmb0mbmb0@yandex.ru, пожалуйста.
Спасибо
то Idex: За пару лет работы с Vendotek пришли к выводу, что легче с ним работать по протоколу пульс. Он работает точно так же как обычный купюрник ICT V7, причем вешается параллельно выходу купюрнтка. И там и там, выход на открытый коллектор. Стоимость импульса можно задавать через обновления прошивки через сервис Vendotek или через банк. Если вешаете на один канал с кпюрником то 1 импульс = 10 рублям. Физически, питание +12 вольт подаете на ХР2 контакт 1 GND-контакт 2 Импульсы снимаете с XP1 с контакта 11 (IO1/COIN OUT1). Скважность импульса так же можно задать программно, но обычно 50 мс 50%
Sab, здравствуйте, прошу вас помочь разобраться с работой вендотек по com порту, прошу связаться со мной dm-iv@bk.ru Отблагодарю финансово за помощь. С пульсом все понятно, я не могу разобраться с работой по протоколу vtk.
#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 работала на этом скетче. Я уже не буду вспоминать, что и как там по алгоритмам, разбирайтесь сами, там некоторые пояснения есть. Договоритесь с вендотеком, чтобы вам прошили ваш присланный им терминал прошивкой для интеграции. Потому что по воздуху они не шьют данную прошивку. Когда получите данный терминал, то у вас появится возможность без связи с банком, прикладывая карту получать валидную транзакцию без снятия средств с карты. Только так вы сможете у себя откатать данный протокол. Всё чем мог , я помог. Больше не просите меня, даже за деньги, вернуться к этому проекту.
Огромное спасибо
Здравствуйте. Как решили проблему? Нашли ошибки в коде? Хотелось бы пообщаться на данную тему s_shershnev@mail.ru