Arduino не может прочитать 0x41 и 0x42 (отлично читает другие (приемник банкнот ICT)
Вот моя проблема:
Мой код успешно распознает и принимает купюры в 1 доллар (0x40) и 20 долларов (0x43), но ему не удается распознать, отобразить и обработать что-либо для купюр в 5 долларов (0x41) и 10 долларов (0x42). Кроме того, когда я говорю «Arduino», я, кстати, имею в виду TTGO...
Я проверил, что купюроприемник действительно отправляет правильное значение (0x41) для купюр номиналом 5 и 10 долларов (0x42), используя внешний инструмент мониторинга, такой как Docklight, а также я использовал осциллограф! Все сигналы от всех типов банкнот были практически идентичны и действительны. Однако код Arduino, похоже, вообще не получает эти два значения (и ТОЛЬКО эти два значения)... Между тем, он будет отображать все остальные мелочи... У меня есть настройка кода, в которой он отображает все входящие байты. , будь то БА (купюроприемник), сигналы ожидания, сигналы отклонения, все, но он гаснет на 100%, МВД, для 0x41 и 0x42... ПОЧЕМУ?!?! Так чертовски случайно...
============================================ ====
Чтобы вы все знали, вот как работает купюроприемник (BA):
- Вставить счет в BA
- BA отправляет соответствующее шестнадцатеричное значение (например, 0x40) счета на мой Arduino (используя кабели RS232 и преобразователь RS232 в TTL (конвертеры подтверждены на 100% в рабочем состоянии))
- Как только Arduino «увидит» шестнадцатеричное значение для счета со значением N, затем он отправит 0x02 в BA, чтобы принять счет.
- Если 0x02 НЕ отправлено BA в течение 5 секунд, он отклонит счет и выплюнет его обратно.
- Затем код добавляет это значение к «общему количеству».
OFC, мой код настроен таким образом, что единственный способ отправки сигнала принятия (0x02) — это ЕСЛИ получено 0x4N... Итак, тот факт, что 0x41 и 0x42 исчезают в воздухе, означает, что 0x02 никогда не отправляется, поэтому эти два значения всегда отклоняются... Очень, очень простые вещи, поэтому тот факт, что он постоянно не может ТОЛЬКО НЕ читать 0x41 и 0x42, одновременно четко отображая все остальные отправленные HEX-значения, вызывает у меня неограниченную головную боль и беспокойство... Программирование... УРА! -_-
Итак, кто-нибудь... пожалуйста, вы знаете, что происходит? Сигнал генерируется на 100%, и мой код ниже настроен на отображение всех входящих байтов, но он действует так, как будто 0x41 и 0x42 вообще не существуют! Ничего. Нада. Зильч. Что за черт? Он буквально обрабатывает все, что я могу ему предложить... кроме 0x41 и 0x42!!! ФУУУУУУУУУУ!!! Так злюсь...
ВОТ ПРОТОКЛ ICT RS232 ДЛЯ МОЕГО КУПОНОПРИЕМНИКА - http://tdmegalit.ru/upload /iblock/401/ict_protocol.pdf
ТАКЖЕ У МЕНЯ ВСЕ DIP-ПЕРЕКЛЮЧАТЕЛИ ПРАВИЛЬНО УСТАНОВЛЕНЫ, БЛОК ПИТАНИЯ ИДЕАЛЬНЫЙ, ВСЕ ПРОВОДА ПРОВЕРЕНЫ И ИДЕАЛЬНЫ, ПРЕОБРАЗОВАТЕЛИ RS232 В TTL ИДЕАЛЬНЫ. Я ДУМАЮ, ЭТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ИЛИ TTGO
Итак, учитывая все вышесказанное, ниже приведен мой код. Это часть огромной программы, поэтому, чтобы исключить вероятность того, что остальная часть кода вызывает ошибку, я сократил ее до того, что вы видите ниже, но проблема осталась... блин
Кроме того, я включил ЖУРНАЛ последовательного монитора. В ЖУРНАЛЕ ниже показан запуск, а затем вставка банкноты номиналом 1, 5, 10 и 20 долларов...
ЖУРНАЛ ПОСЛЕДОВАТЕЛЬНОГО МОНИТОРА:
PLZ NOTE, I ADDED SPACES TO SHOW WHATS GOING ON...
====================================================================
... Received: 0x80 // СИГНАЛЫ холостого хода (ПИТАНИЕ BA ВКЛЮЧЕНО ПЕРЕД ОТПРАВКОЙ сообщения «НАСТРОЙКА»)
... Received: 0x8F
... Received: 0x80
... Received: 0x8F
... Received: 0x80
... Received: 0x8F
SETUP - ...Sent: STX //НАСТРОЙКА ДЛЯ ИНИТАЛИЗАЦИИ BA
SETUP - ...Sent: DLE
SETUP - ...Sent: ETX
=======================
//ВСТАВЛЕНО $1 (0x40) УСПЕХ!!!
... Received: 0x40
$1 accepted
... Sent: 0x02
... Received: 0x10
//ВСТАВЛЕНО $5 и 5 секунд спустя 0x29>>0x29>>0x2F = Отклонение
... Received: 0x29
Bill rejected
... Received: 0x29
Bill rejected
... Received: 0x2F
//ВСТАВЛЕНО $10 и 5 секунд спустя 0x29>>0x29>>0x2F = Отклонение
... Received: 0x29
Bill rejected
... Received: 0x29
Bill rejected
... Received: 0x2F
//ВСТАВЛЕНО $20 (0x43) УСПЕХ!!!
... Received: 0x43
$20 accepted
... Sent: 0x02
... Received: 0x10
КОД КУПЛОАКЦЕПТОРА:
#include <SoftwareSerial.h>
SoftwareSerial BA(32, 33); // прием, передача
int billCounter = 0;
void setup() {
Serial.begin(9600);
BA.begin(9600);
delay(3000); // ПОДОЖДИТЕ BC ТРЕШ
BA.write(0x02); // Отправляем команду инициализации (STX)
Serial.println("SETUP - ...Sent: STX");
BA.write(0x10); // Отправляем команду включения купюроприемника
Serial.println("SETUP - ...Sent: DLE");
BA.write(0x03); // Отправляем конец текстового символа (ETX)
Serial.println("SETUP - ...Sent: ETX");
Serial.println("=======================");
}
void loop() {
if (BA.available()) {
byte receivedByte = BA.read();
Serial.print("... Received: 0x");
Serial.println(receivedByte, HEX);
if (receivedByte == 0x29) {
delay(200);
Serial.println("Bill rejected");
// Здесь обрабатываем отклонение счета (например, отображаем сообщение или выполняем необходимые действия)
} else if (receivedByte == 0x40) {
delay(200);
Serial.println("$1 accepted");
BA.write(0x02); // Отправляем шестнадцатеричное значение 0x02, чтобы принять счет
Serial.println("... Sent: 0x02");
// Увеличиваем счетчик на $1
billCounter += 1;
} else if (receivedByte == 0x41) {
delay(200);
Serial.println("$5 accepted");
BA.write(0x02); // Отправляем шестнадцатеричное значение 0x02, чтобы принять счет
Serial.println("... Sent: 0x02");
// Увеличиваем счетчик на $5
billCounter += 5;
} else if (receivedByte == 0x42) {
delay(200);
Serial.println("$10 accepted");
BA.write(0x02); // Отправляем шестнадцатеричное значение 0x02, чтобы принять счет
Serial.println("... Sent: 0x02");
// Увеличиваем счетчик на $10
billCounter += 10;
} else if (receivedByte == 0x43) {
delay(200);
Serial.println("$20 accepted");
BA.write(0x02); // Отправляем шестнадцатеричное значение 0x02, чтобы принять счет
Serial.println("... Sent: 0x02");
// Увеличиваем счетчик на $20
billCounter += 20;
} else if (receivedByte == 0x44) {
delay(200);
Serial.println("$50 accepted");
BA.write(0x02); // Отправляем шестнадцатеричное значение 0x02, чтобы принять счет
Serial.println("... Sent: 0x02");
// Увеличиваем счетчик на $50
billCounter += 50;
} else if (receivedByte == 0x45) {
delay(200);
Serial.println("$100 accepted");
BA.write(0x02); // Отправляем шестнадцатеричное значение 0x02, чтобы принять счет
Serial.println("... Sent: 0x02");
// Увеличиваем счетчик на 100 долларов
billCounter += 100;
}
}
}
@Mappy Wilks, 👍4
Обсуждение2 ответа
Лучший ответ:
По умолчанию для Arduino Serial — 8 бит данных, без четности, одна остановка. кусочек. На первой странице ваших связанных документов написано: Стартовый бит 1, Данные. бит 8, бит четности, стоповый бит 1. Несовпадение параметра четности. могло бы объяснить частичный провал этого общения. документация для метода Serial Begin() описывает различные параметры конфигурации.
Однако см. также эту тему: https://forum.arduino.cc/t/altsoftserial-how-to- изменение-паритет-решено/668535 Похоже, что различные библиотеки последовательного программного обеспечения не поддерживают ЧЕТНЫЕ настройки четности. Используйте аппаратный последовательный порт на вашем TTGO Arduino. вместо. Это может означать использование SoftwareSerial для отладочной печати. (возможно, с адаптером USB/UART) и выделение последовательного порта оборудования порт на устройство чтения банкнот.
Спасибо, 6v6gt! Использование HardwareSerial было ответом, и установка бита четности на EVEN тоже была ответом :D Вот что я сделал, чтобы исправить это, если кому-нибудь когда-нибудь понадобится увидеть этот ответ в будущем...
Также обратите внимание, вот логика:
По умолчанию hardware serial — SERIAL_8N1, но мне нужно было использовать SERIAL_8E1 для четности, потому что:
SERIAL_8N1 означает «8»; бит, "Нет" четности и "1"; стоповый бит (следовательно, 8N1)
SERIAL_8E1 означает «8»; биты, "четность" и "1"; стоповый бит (отсюда 8E1)
Вот диаграмма, которую я использовал, чтобы получить нужный мне формат протокола:
/* Baud-rates available: 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, or 115200, 256000, 512000, 962100
*
* Protocols available:
* SERIAL_5N1 5-bit No parity 1 stop bit
* SERIAL_6N1 6-bit No parity 1 stop bit
* SERIAL_7N1 7-bit No parity 1 stop bit
* SERIAL_8N1 (the default) 8-bit No parity 1 stop bit
* SERIAL_5N2 5-bit No parity 2 stop bits
* SERIAL_6N2 6-bit No parity 2 stop bits
* SERIAL_7N2 7-bit No parity 2 stop bits
* SERIAL_8N2 8-bit No parity 2 stop bits
* SERIAL_5E1 5-bit Even parity 1 stop bit
* SERIAL_6E1 6-bit Even parity 1 stop bit
* SERIAL_7E1 7-bit Even parity 1 stop bit
* SERIAL_8E1 8-bit Even parity 1 stop bit
* SERIAL_5E2 5-bit Even parity 2 stop bit
* SERIAL_6E2 6-bit Even parity 2 stop bit
* SERIAL_7E2 7-bit Even parity 2 stop bit
* SERIAL_8E2 8-bit Even parity 2 stop bit
* SERIAL_5O1 5-bit Odd parity 1 stop bit
* SERIAL_6O1 6-bit Odd parity 1 stop bit
* SERIAL_7O1 7-bit Odd parity 1 stop bit
* SERIAL_8O1 8-bit Odd parity 1 stop bit
* SERIAL_5O2 5-bit Odd parity 2 stop bit
* SERIAL_6O2 6-bit Odd parity 2 stop bit
* SERIAL_7O2 7-bit Odd parity 2 stop bit
* SERIAL_
РЕШЕНИЕ КОДА:
#include <HardwareSerial.h>
HardwareSerial BA(1); // Использовать hardware serial на TTGO
void setup() {
Serial.begin(9600);
BA.begin(9600, SERIAL_8E1, 32, 33); // (Скорость передачи данных, Протокол, RX, TX)
... //остальная часть моего кода
По умолчанию для Arduino Serial используется 8 бит данных, без четности, один стоповый бит
. На первой странице ваших связанных документов написано: Стартовый бит 1, Бит данных 8, Бит четности, Стоповый бит 1
. Несовпадающий параметр четности может объяснить частичный сбой этой связи. В документации метода Serial Begin() описаны различные параметры конфигурации.
Однако см. также эту тему: https://forum.arduino. cc/t/altsoftserial-how-to-change-parity-solved/668535 Похоже, что различные последовательные библиотеки программного обеспечения не поддерживают настройки четности EVEN. Вместо этого используйте аппаратный последовательный порт на вашем TTGO Arduino. Это может означать использование SoftwareSerial для отладочной печати (возможно, с адаптером USB/UART) и выделение аппаратного последовательного порта для устройства чтения банкнот.
- Ардуино для чтения с преобразователя RS232 в последовательный модуль TTL
- Использование Arduino для чтения и записи данных на устройство RS232
- Искаженный серийный номер устройства GPS
- AT-команда не отвечает на последовательный монитор
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Как остановить SoftwareSerial от получения данных и повторно включить его в какой-то другой момент?
- Как читать и записывать на устройство rs232 с/на Arduino
- Не нашел датчик отпечатков пальцев :( Arduino Mega 2560 Adafruit Fingerprint Sensor
похоже, что валидатор банкнот отклоняет 10 и 5, @jsotola
@jsotola Однако это не так. Как видите, для 1 и 20 при вставке купюры отображаются 0x40 и 0x43. Между тем, для 5 и 10 абсолютно ничего не появляется, и оно автоматически отклоняется через 5 секунд... Опять же, я подтвердил, что купюры в 5 и 10 долларов действительно отправляют шестнадцатеричное значение, но мой код ничего не показывает только для купюр в 5 и 10 долларов, фууууу, @Mappy Wilks
По умолчанию для Arduino Serial установлено «8 бит данных, без четности, один стоповый бит». На первой странице ваших связанных документов написано:
Стартовый бит 1, бит данных 8, бит четности, стоповый бит 1
. Несовпадающий параметр четности может объяснить частичный сбой в этом процессе. Посмотрите на метод (Software) Serial Begin(), чтобы изменить это., @6v6gt@ 6v6gt, ты должен дать ответ., @Rohit Gupta