Небольшой проект, прошу помощи.

ra9mli
Offline
Зарегистрирован: 26.10.2015

Помогите реализовать идею. Хочу подключить блок ЭКЛЗ от кассового аппарата к ардуино для считывания заводского и регистрационного номера.
С ардуино столкнулся недавно, поэтому только начинаю осваивать и в языке С пока не силен, только разбираюсь.
В общем сам блок имеет два разных интерфейса, Serial и интерфейс I2C.
на блоке 6 выводов:
Rx
Tx
SDA
ACL
Enable
+5v
GND

Цепь выбора интерфейса осуществляется путем выбора контакта Enable:
При обмене ККМ с ЭКЛЗ по интерфейсу I2C этот контакт должен быть соединен с общим проводом.
При обмене ККМ с ЭКЛЗ по интерфейсу RS-232 этот контакт должен быть соединен с цепью питания ЭКЛЗ (+5В).
С этим я разобрался и подключил. (SDA - A4, SCL - A5, Enable - +5v).

В интерфейсе ККМ- ЭКЛЗ разрешен следующий набор команд: 
• 01h, 81h - активизация; 
• 02h - установка параметров обмена; 
• 03h - запрос дампа Архива; 
• 04h - произвольный текст; 
• 05h - запрос данных отчета; 
• 06h - прекращение; 
• 07h - запрос состояния ЭКЛЗ; 
• 08h - тест; 
• 09h - закрытие смены; 
• 0Аh - закрытие Архива; 
• 10h - продажа; 
• 11h - покупка; 
• 12h - возврат продажи; 
• 13h - возврат покупки; 
• 14h, 94h - запрос номера ЭКЛЗ; 
• 16h - скидка; 
• 17h - наценка; 
• 18h - сторно; 
• 19h, 99h - завершение документа; 
• 20h, А0h - запрос контрольной ленты; 
• 21h, А1h - запрос документа; 
• 22h, А2h - запрос отчета; 
• 23h, А3h - запрос итогов смены; 
• 24h, А4h - запрос итога активизации. 
Если бит7 кода команды равен0, информация ответа(КПК и данные отчетов) 
возвращается в числовой форме, иначе- в текстовой форме.

На данный момент, меня интересует только команды 14h, 94h - запрос номера ЭКЛЗ; 
Реализовать идею хочу следующим способом: Я подключаю эклз к разьему, нажимаю на кнопку, идет считывание номеров и отображается на дисплее (дисплей 16 х 2). 
Но пока хочу разобраться хотя бы с написанием программного кода, который бы позволил найти ЭКЛЗ по шине I2C и вывести данные на монитор порта. Я так понимаю что у каждого устройства шины i2C есть свой идентификатор? Как можно его узнать или есть варианты найти его?

Вот пример того как начинаю код я.

#include <Wire.h> // подключаю библиотеку
int eklz_add = 0x02; // назначение адреса идентификации по шине 
 
void setup() {
  
Serial.begin(9600); //запускаем  
Wire.begin(); // запускаем
}
 
void loop() {
  
Wire.beginTransmission(eklz_add);
Wire.write(0x00);
Wire.write(0x14); // отправляем команду
Wire.endTransmission(); //
Wire.requestFrom(eklz_add, 3);
while(Wire.available() == 0);
int e = Wire.read();
Serial.println(e); // печатаем 
delay(500);
}

В итоге монитор порта ни чего не выдает.

ra9mli
Offline
Зарегистрирован: 26.10.2015

Есть пример того как посылает команды на эклз заводская программа:
==> 02 01 14 15
<== 06
<== 02
<== 06
<== 00
<== 12 42 54 72 21
<== 51

Сам регистрационный номер получается:1242547221
Может подскажет кто нибудь?

Код команды 0х14 (0х94)

Содержание ответа от ЭКЛЗ (для кода команды 14Н).

Номер байта Значение Комментарии
0_____________02H_____________STX
1_____________06H_____________Длина сообщения
2_____________00Н_____________Код ответа
3_____________10H_____________ Номер ЭКЛЗ (1032456789)
4_____________32H
5_____________45H
6_____________67H
7 _____________89H
8______________________________Контрольная сумма

Получается в строке

Wire.requestFrom(eklz_add, 3);
 

осле адреса устройства, мы указываем номер байта ?
Тогда как прописать последовательность байтов от 3 до 7 и как в нормальном виде отобразить в мониторе порта?

bwn
Offline
Зарегистрирован: 25.08.2014

Найдите программу "I2C сканер" и ею считайте адрес.

ra9mli
Offline
Зарегистрирован: 26.10.2015

Сканер нашел. адрес получился 0х02.

Но, что-то ни ка не могу сообразить как считать последовательность байтов. И даже при считывании 1го любого байта, данный момент в мониторе порта выводит "-1".

bwn
Offline
Зарегистрирован: 25.08.2014

Это уже I2C протокол курите, вроде где то в описаниях часов было неплохо расписано. У меня пока такого вопроса не возникало, не помогу.