Небольшой проект, прошу помощи.
- Войдите на сайт для отправки комментариев
Помогите реализовать идею. Хочу подключить блок ЭКЛЗ от кассового аппарата к ардуино для считывания заводского и регистрационного номера.
С ардуино столкнулся недавно, поэтому только начинаю осваивать и в языке С пока не силен, только разбираюсь.
В общем сам блок имеет два разных интерфейса, 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); }
В итоге монитор порта ни чего не выдает.
Есть пример того как посылает команды на эклз заводская программа:
==> 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______________________________Контрольная сумма
Получается в строке
осле адреса устройства, мы указываем номер байта ?
Тогда как прописать последовательность байтов от 3 до 7 и как в нормальном виде отобразить в мониторе порта?
Найдите программу "I2C сканер" и ею считайте адрес.
Сканер нашел. адрес получился 0х02.
Но, что-то ни ка не могу сообразить как считать последовательность байтов. И даже при считывании 1го любого байта, данный момент в мониторе порта выводит "-1".
Это уже I2C протокол курите, вроде где то в описаниях часов было неплохо расписано. У меня пока такого вопроса не возникало, не помогу.