Левые данные при считывание uart

Тема в разделе "Arduino & Shields", создана пользователем atomo2, 28 май 2021.

  1. atomo2

    atomo2 Нуб

    Добрый день. Считываю 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

    Что делаю не так? Спасибо.
     
  2. Un_ka

    Un_ka Гуру

    Какая схема, какие модули?
    Судя по коду вы посылаете данные туда же откуда они приходят.
     
    Feofan нравится это.
  3. b707

    b707 Гуру

    так это наверное идентификаторы типа данных - 12 - время, 14 - вес
    а это похоже на сообщение об ошибке с кодом - ошибка Е01

    atomo2 - у вас мануал к весам есть? - там должен быть описан протокол обмена
     
  4. atomo2

    atomo2 Нуб

    Нарисовал всю схему, чтобы было проще меня понять:DЭто то, что я сейчас пытаюсь сделать
    [​IMG]

    А вообще нужно реализовать вот такой вариант. При печати с весов чека, добавить в чек единоразово (модель весов ,серийный номер весов, дату-месяц-год), а при печати веса, каждый раз время взвешивания (время).
    [​IMG]
    Возможно, Просто если смотреть в порте Arduino IDE , то там эти символы не отображаются, а если смотреть в Terminal 1.9b , то там они есть.
    Есть инструкция

    Да, на странице 65-66 есть про эту ошибку, но так, как я нубяра, что сделать нужно? Куда копать?)
     
    Последнее редактирование: 28 май 2021
  5. Un_ka

    Un_ka Гуру

    Мне кажется модуль весов шлёт ошибку Е01 из-за получения строки:
    Отключите tx от него и посмотрите что будет.
     
  6. b707

    b707 Гуру

    схема принципиально неверная. Пины 0 и 1 на Нано и интерфейс USB , который вы подключаете к ПК - это один и тот же логический порт.
    У вас данные, пришедшие с весов и данные посылаемые с ардуины - перемешиваются, отсюда и ошибки
     
    Daniil нравится это.
  7. atomo2

    atomo2 Нуб

    Да , отключив TX , поток левых данных прекратился
     
  8. atomo2

    atomo2 Нуб

    Так с этими весами более менее разобрался, в них уже есть вывод нужной информации по международному стандарту 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
    ***************

    Ибо сам не осилю такое, наверное:D

    PS и есть еще один нюанс, на компьютер чек приход в нормальном виде, а на прямую если к весам подключить принтер, то чек корявый, одна строчка нормально, а вторая к вверх ногами
    [​IMG]
     
    Последнее редактирование: 31 май 2021
  9. Igor68

    Igor68 Гуру

    Странный подход к RS232 - он для связи двух устройств, а третье может только прослушивать своим RX любую из линий (TX любого из устройств в схеме).
     
  10. atomo2

    atomo2 Нуб

    Пока смог вот так заколхозить.
    Код (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-я кнопка пока не печатает конец чека:D
     
  11. atomo2

    atomo2 Нуб

    И так получилось завязать , на 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
    ***************

    Теперь, нужно часы привязать, может кто подскажет?))
     
  12. Un_ka

    Un_ka Гуру

    Откуда будете брать время?
     
  13. atomo2

    atomo2 Нуб

    Есть микросхема времени 3231
     
  14. atomo2

    atomo2 Нуб

    И так сделал считывание с весов , добавил кнопки 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;

       }
    }
     
    [​IMG]
     
    Последнее редактирование: 3 июн 2021
  15. atomo2

    atomo2 Нуб

    И так,почти готовый скетч. Осталось только прикрутить время когда с весов идет вес.
    Код (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;
         }
    }
     
     
  16. atomo2

    atomo2 Нуб

    Почтииии:D Готовый скетч на 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
     
  17. Un_ka

    Un_ka Гуру

    Метод read класса serial не только возвращает байт, но и удаляет его из буферов serial порта и вы его повторно получить не можете.

    Правильно так:
    Код (C++):
    char buff = Serial.read();
    mySerial.write(buff, BYTE);
       
        if (buff == 'S') {
     
    atomo2 нравится это.
  18. atomo2

    atomo2 Нуб

    Спасибо) что же все так сложно то)) теперь при компиляции пишет
    Ключевое слово 'BYTE' больше не поддерживается.
     
  19. Un_ka

    Un_ka Гуру

    Попробуйте без него.