Добрый день. Считываю nano по uart с весов данные (при нажатии на весах кнопки Print, отправляется чек на печать) Код (C++): void setup() { Serial.begin(9600); } void loop() { if (Serial.available() > 0) { String str = Serial.readString(); Serial.println(str); } } В ответ получаю почти нормальный чек, кроме символов (на форуме не отображаются) перед временем и весом (12 и 14) HEX 12 31 30 3A 31 33 3A 35 30 0D 0A 14 2B 20 20 30 2E 30 30 30 2F 30 20 67 20 20 ASCII 10:13:50 + 0.000/0 g А после с весов летит какая то фигня без перерыва HEX 0D 0A 0D 0A 45 30 31 0D 0A 45 30 31 0D 0A 45 30 31 0D 0A 0D 0A 45 30 31 0D 0A 45 30 31 0D 0A 45 30 31 0D 0A 0D 0A 45 30 31 0D 0A 45 30 31 0D 0A 0D 0A 45 30 31 0D 0A 45 30 31 0D 0A 45 30 31 0D 0A 0D 0A 45 30 31 0D 0A 45 30 310D 0A 45 30 31 0D 0A 45 30 31 0D 0A 0D 0A ASCII E01 E01 E01 Что делаю не так? Спасибо.
так это наверное идентификаторы типа данных - 12 - время, 14 - вес а это похоже на сообщение об ошибке с кодом - ошибка Е01 atomo2 - у вас мануал к весам есть? - там должен быть описан протокол обмена
Нарисовал всю схему, чтобы было проще меня понятьЭто то, что я сейчас пытаюсь сделать Спойлер: Схема 1 А вообще нужно реализовать вот такой вариант. При печати с весов чека, добавить в чек единоразово (модель весов ,серийный номер весов, дату-месяц-год), а при печати веса, каждый раз время взвешивания (время). Спойлер: Схема 2 Возможно, Просто если смотреть в порте Arduino IDE , то там эти символы не отображаются, а если смотреть в Terminal 1.9b , то там они есть. Есть инструкция Спойлер: Яндекс.диск https://yadi.sk/i/6DwdZgIkYb5oqQ Да, на странице 65-66 есть про эту ошибку, но так, как я нубяра, что сделать нужно? Куда копать?)
Мне кажется модуль весов шлёт ошибку Е01 из-за получения строки: Отключите tx от него и посмотрите что будет.
схема принципиально неверная. Пины 0 и 1 на Нано и интерфейс USB , который вы подключаете к ПК - это один и тот же логический порт. У вас данные, пришедшие с весов и данные посылаемые с ардуины - перемешиваются, отсюда и ошибки
Так с этими весами более менее разобрался, в них уже есть вывод нужной информации по международному стандарту GMP. Спойлер: Чек SHINKO DENSHI TYPE: HTR-220CE S/N: 101852097 ID: START DATE:31.05.2021 TIME: 10:54 10:54:43 + 0.005/8 g 10:54:46 + 0.005/8 g 10:54:48 + 0.005/8 g END DATE:31.05.2021 TIME: 10:54 SIGNATURE *************** Готов заказать проект(скетч). Который будут печать такой чек. С дополнительной кнопкой, как я понимаю. То есть на доп кнопку мы вешаем вывод начало чека и конец чека Спойлер: Начало чека SHINKO DENSHI TYPE: HTR-220CE S/N: 101852097 ID: START DATE:31.05.2021 TIME: 10:54 Потом с кнопки весов печатается обычный вес с весов Спойлер: Вес 10:54:43 + 0.005/8 g 10:54:46 + 0.005/8 g 10:54:48 + 0.005/8 g И опять же при нажатии доп кнопки конец чека Спойлер: Конец чека END DATE:31.05.2021 TIME: 10:54 SIGNATURE *************** Ибо сам не осилю такое, наверное PS и есть еще один нюанс, на компьютер чек приход в нормальном виде, а на прямую если к весам подключить принтер, то чек корявый, одна строчка нормально, а вторая к вверх ногами Спойлер: Корявый чек
Странный подход к RS232 - он для связи двух устройств, а третье может только прослушивать своим RX любую из линий (TX любого из устройств в схеме).
Пока смог вот так заколхозить. Код (C++): void setup() { Serial.begin(9600); pinMode(3, INPUT_PULLUP); pinMode(2, INPUT_PULLUP); } bool flag = false; uint32_t btnTimer = 0; void loop() { if (Serial.available() > 0) { String str = Serial.readString(); Serial.println(str); } bool btnState = !digitalRead(3); if (btnState && !flag && millis() - btnTimer > 100) { flag = true; btnTimer = millis(); Serial.println("***************"); Serial.println("HTR-220CE"); Serial.println("S/N: 101852097"); Serial.println("START"); bool btnState = !digitalRead(2); if (btnState && !flag && millis() - btnTimer > 100) { flag = true; btnTimer = millis(); Serial.println("END"); Serial.println("SIGNATURE"); Serial.println("***************"); } if (!btnState && flag && millis() - btnTimer > 100) { flag = false; btnTimer = millis(); //Serial.println("release"); } } Нажимаю 1-ю кнопку (назовем ее Start) печатается начало чека, потом печатаем вес с весов и нажимаем 2-ю кнопку (назовем ее END) печатается конец чека. Теперь нужно как то в код , вклеить чтобы время печаталось при взвешивание и время с датой при нажатии кнопки Start и End выводилось Ну и опять же , все это пока в терминал на ПК выводится, а не на принтер Ps. 2-я кнопка пока не печатает конец чека
И так получилось завязать , на 2 кнопки все Спойлер: Код Код (C++): #include "sav_button.h" SButton button1(4,50,2000,4000,1000); SButton button2(3,50,2000,4000,1000); void setup() { Serial.begin(9600); button1.begin(); button2.begin(); } void loop(){ if (Serial.available() > 0) { String str = Serial.readString(); Serial.println(str); } switch( button1.Loop() ){ case SB_CLICK: Serial.println("***************"); Serial.println("BW-60RB"); Serial.println("S/N: 014330529"); Serial.println("START"); break; case SB_LONG_CLICK: Serial.println("Speed 9600"); break; } switch( button2.Loop() ){ case SB_CLICK: Serial.println("END"); Serial.println("SIGNATURE"); Serial.println("***************"); break; case SB_LONG_CLICK: Serial.println("Organika"); break; } }[/SPOILER] *************** BW-60RB S/N: 014330529 START + 0.000/2 g + 0.001/7 g + 0.001/6 g END SIGNATURE *************** Теперь, нужно часы привязать, может кто подскажет?))
И так сделал считывание с весов , добавил кнопки Start и End , все работает нормально. Теперь только микросхему времени осталось связать с кодом, чтобы при нажатии этих кнопок добавлялось время и дата. PS и решить проблему с переворотом строчек принтером(а точнее весов) , но это уже не главное Код (C++): #include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); // RX, TX #include "sav_button.h" SButton button1(4,50,2000,4000,1000); SButton button2(3,50,2000,4000,1000); void setup() { Serial.begin(9600); mySerial.begin(9600); button1.begin(); button2.begin(); } void loop() { if (Serial.available()) mySerial.write(Serial.read()); switch( button1.Loop() ){ case SB_CLICK: mySerial.print("***************\r\nBW-60RB\r\nS/N: 014330529\r\nSTART\r\n"); break; case SB_LONG_CLICK: mySerial.println("Speed 9600"); break; } switch( button2.Loop() ){ case SB_CLICK: mySerial.print("\r\nEND\r\nSIGNATURE\r\n***************\r\n"); break; case SB_LONG_CLICK: mySerial.println("Organika"); break; } } Спойлер: Фото
И так,почти готовый скетч. Осталось только прикрутить время когда с весов идет вес. Код (C++): #include "microDS3231.h" MicroDS3231 rtc; #include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); // RX, TX #include "sav_button.h" SButton button1(4,50,2000,4000,1000); SButton button2(3,50,2000,4000,1000); void setup(){ Serial.begin(9600); mySerial.begin(9600); button1.begin(); button2.begin(); if (rtc.lostPower()) { rtc.setTime(COMPILE_TIME); } //rtc.setTime(SEC, MIN, HOUR, DAY, MONTH, YEAR); // устанвока времени вручную } void loop(){ if (Serial.available()) mySerial.write(Serial.read()); switch( button1.Loop() ){ case SB_CLICK: mySerial.print("***************\r\nBW-60RB\r\nS/N: 014330529\r\n\r\nSTART TIME\r\n"); mySerial.print(rtc.getHours()); mySerial.print(":"); mySerial.print(rtc.getMinutes()); mySerial.print(":"); mySerial.print(rtc.getSeconds()); mySerial.print("\r\nDATE:"); mySerial.print(" "); mySerial.print("\r\n "); mySerial.print(rtc.getDate()); mySerial.print("/"); mySerial.print(rtc.getMonth()); mySerial.print("/"); mySerial.println(rtc.getYear()); break; case SB_LONG_CLICK: mySerial.println("Speed 9600"); break; } switch( button2.Loop() ){ case SB_CLICK: mySerial.print("\r\nEND TIME\r\n"); mySerial.print(rtc.getHours()); mySerial.print(":"); mySerial.print(rtc.getMinutes()); mySerial.print(":"); mySerial.print(rtc.getSeconds()); mySerial.print("\r\nDATE:\r\n"); mySerial.print(" "); mySerial.print(rtc.getDate()); mySerial.print("/"); mySerial.print(rtc.getMonth()); mySerial.print("/"); mySerial.println(rtc.getYear()); mySerial.print("\r\nSIGNATURE\r\n***************"); break; case SB_LONG_CLICK: mySerial.println("Organika"); break; } }
Почтииии Готовый скетч на 99% Код (C++): #include "microDS3231.h" MicroDS3231 rtc; #include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); // RX, TX #include "sav_button.h" SButton button1(4,50,2000,4000,1000); SButton button2(3,50,2000,4000,1000); void setup(){ Serial.begin(9600); mySerial.begin(9600); button1.begin(); button2.begin(); if (rtc.lostPower()) { rtc.setTime(COMPILE_TIME); } //rtc.setTime(SEC, MIN, HOUR, DAY, MONTH, YEAR); // устанвока времени вручную } void loop(){ if (Serial.available()) mySerial.write(Serial.read()); int buff = Serial.read(); if (buff == 'S') { mySerial.print(rtc.getHours()); mySerial.print(":"); mySerial.print(rtc.getMinutes()); mySerial.print(":"); mySerial.print(rtc.getSeconds()); mySerial.print(" "); } switch( button1.Loop() ){ case SB_CLICK: mySerial.print("***************\r\nBW-60RB\r\nS/N: 014330529\r\n\r\nSTART TIME: "); mySerial.print(rtc.getHours()); mySerial.print(":"); mySerial.print(rtc.getMinutes()); mySerial.print(":"); mySerial.print(rtc.getSeconds()); mySerial.print("\r\nDATE:"); mySerial.print(" "); mySerial.print(rtc.getDate()); mySerial.print("/"); mySerial.print(rtc.getMonth()); mySerial.print("/"); mySerial.println(rtc.getYear()); mySerial.print("\r\n"); break; case SB_LONG_CLICK: mySerial.println("Speed 9600"); break; } switch( button2.Loop() ){ case SB_CLICK: mySerial.print("\r\nEND TIME: "); mySerial.print(rtc.getHours()); mySerial.print(":"); mySerial.print(rtc.getMinutes()); mySerial.print(":"); mySerial.print(rtc.getSeconds()); mySerial.print("\r\nDATE:"); mySerial.print(" "); mySerial.print(rtc.getDate()); mySerial.print("/"); mySerial.print(rtc.getMonth()); mySerial.print("/"); mySerial.println(rtc.getYear()); mySerial.print("\r\nSIGNATURE\r\n***************"); break; case SB_LONG_CLICK: mySerial.println("Organika"); break; } } Но есть одна проблема , почему после отслеживания литеры S , вес выдается как попало и вот только на 4 нажатии выдало , как нужно? а дальше опять бардак.... -0000005 S 0000007 G S -000.0007 S -000.0006 G 17:55:59 (выдало как нужно!) 000000 G 17:56:35 -000.006 G 17:56:44 -000.0006G S -000.00 G S-000.006 G S -000.0006 G S -00.006 S-000.0006 G S-0000006G S -000.0005 G S -000.0010G S
Метод read класса serial не только возвращает байт, но и удаляет его из буферов serial порта и вы его повторно получить не можете. Правильно так: Код (C++): char buff = Serial.read(); mySerial.write(buff, BYTE); if (buff == 'S') {
Спасибо) что же все так сложно то)) теперь при компиляции пишет Ключевое слово 'BYTE' больше не поддерживается.