Arduino Mega + Меркурий 203.2Т RS485

Тема в разделе "Проводная и беспроводная связь", создана пользователем santi90, 25 сен 2019.

  1. santi90

    santi90 Нерд

    Добрый день! Пытаюсь считать данные со счетчика Меркурий посредством Arduino Mega
    Для обмена использую модуль rs485-troyka. Никак не могу получить данные, при этом пакет запроса исправно уходит! в чем может быть проблема? Все ли правильно с точки зрения кода? для получения ответа необходимо переключать применик и передатчик?
    Модуль - Arduino
    DI -pin16 Tx2
    RO -pin17 Rx2
    (↑↓) - pin14

    скетч

    Код (C++):
    byte inComing [30];
    byte  byteReceived;

    void setup() {
      // put your setup code here, to run once:
    Serial2.begin(9600);
    Serial.begin(9600);

    }

    void loop() {
      // put your main code here, to run repeatedly:
    byte buf[7]={0x02,0x54,0x3F,0xF5,0x27,0x7A,0xB6};
    digitalWrite(14,HIGH);

      Serial2.write(buf,7);


    byte i =0;
    digitalWrite(14,LOW);

    if (Serial2.available() > 0) {  //если есть доступные данные
           while (Serial2.available()) {
     
           Serial.print(Serial2.read());

     
           }
          }

    delay(1000);
    }
     
    Последнее редактирование: 25 сен 2019
  2. DetSimen

    DetSimen Guest

    Ну, мы не против. Пытайся.
     
    NikitOS нравится это.
  3. NikitOS

    NikitOS Public enemy Администратор

    Как код вставлять сами догадаетесь, или в правила направить?
     
    santi90 нравится это.
  4. santi90

    santi90 Нерд

    спасибо!)
     
  5. santi90

    santi90 Нерд

    мои извинения, почему то случилось так, что не до конца отредактированный вариант опубликовался...
     
  6. Daniil

    Daniil Гуру

    Не получается ли после первой посылки вы начинаете приемник долбить запросами?
    Вы уверены что данные отправляются верно? Где-то тут ваш сосед осваивает rs485 (проследите по моим сообщениям) и забыл, что команда врайт выполняется не мгновенно, а значит передергивать ногу rede сразу нельзя.
    Как проверяете правильность выполнения кода?
     
    santi90 нравится это.
  7. parovoZZ

    parovoZZ Гуру

    Чем смотрел?
     
  8. santi90

    santi90 Нерд

    Кстати возможно и так, Tx нещадно горит. К сожалению правильность выполнения кода пока не проверяю никак, ибо узнал что то такое ардуино и его среда разработки только вчера, какого либо отладчика не нашел, а также режима онлайн. Пока пытаюсь раскидать все по условиям и смотреть монитор порта. попробую поставить задержку по времени и почитать ветку с 485. спасибо!
     
  9. santi90

    santi90 Нерд

    Косвенно, знаю что пакет сформирован правильно, согласно монитору порта и моргает Tx , так себе проверка, согласен. Возможно я всего лишь отправляю пакет в порт ардуинки, не более.

    попробую отправить себе на пк и отловить что приходит.
     
  10. parovoZZ

    parovoZZ Гуру

    в какой порт?
    Вообще, надо изучить работу интерфейса UART, а уже потом утверждать...
     
  11. Daniil

    Daniil Гуру

    Попробуйте купить rs485-usb, чтобы замкнуть ардуинку на пк (без прибора) - для отладки. Да, у ардуины с отладкой не оч хорошо, выводите в сериал промежуточную информацию.
    На пк советую программы termite и hterm.
     
    santi90 нравится это.
  12. santi90

    santi90 Нерд

    согласен, надо. обязательно займусь этим чуть позже, ибо сейчас стоит задача получить инфу со счетчика в пределах одного дня, на изучение, как водится, времени не дают.

    а по поводу вопроса, насколько я понял у ардуино мега выделены 4 порта Serial,Serial1,Serial2,Serial3. Тройка, в моем случае подключена к пинам Serial 2, а именно Rx2, Tx2. Вот через них я и отправляю сигналы командой write.
     
  13. santi90

    santi90 Нерд

    спасибо за проги. Как раз сегодня притащил на работу usb -485, сейчас буду тестить.
     
  14. santi90

    santi90 Нерд

    Использовал termite, все прекрасно, прилетает нужная посылка....видимо что то в координации приема -передачи. термит.png
     
  15. Daniil

    Daniil Гуру

    Код все тот же?
    Параметры счетчика совпадают с параметрами Serial2?
     
  16. santi90

    santi90 Нерд

    Параметры портов одинаковые. Счетчик отвечает на данный пакет по USB -485 .
    Код немного поправил!
    Код (C++):

    byte buf[7]={0x02,0x54,0x3F,0xF5,0x27,0x7A,0xB6};
    digitalWrite(14,HIGH);
    for (int i = 0;i<7;i++)
    {
      Serial2.write(buf[i]);
    }

    byte i =0;
    delay(200);
    digitalWrite(14,LOW);
    delay(500);
    if (Serial2.available() > 0) {  //если есть доступные данные
           while (Serial2.available()) {
               
           byteReceived=Serial2.read();
           delay(10);
           inComing[i++]=byteReceived;
         
           }
          }
    delay(20);
     
  17. santi90

    santi90 Нерд

    больше того, сделал интервалы после записи отправил через тремит обратный пакет, он его принял... чет я вообще не понимаю
     
  18. Daniil

    Daniil Гуру

    Расслабьтесь) Я тем более ничего не понимаю. Ваша задача проверить все провода и соединения, проверить программные настройки всех участников общения и написать программу.
     
    santi90 нравится это.
  19. santi90

    santi90 Нерд

    Доброе утрО! Расслабился, это действительно помогло. Все заработало!
    Как вы и сказали, проблема была в тайминге для выполнения write, а именно, перед включением приемника! подобрал delay(8); - идеально! Огромное спасибо, вместо того, чтобы отправлять куда то, действительно дали толковый совет.

    Рабочий скетч, вдруг кому то пригодится!

    Код (C++):

    byte inComing [30];
    byte  byteReceived;

    void setup() {
      // put your setup code here, to run once:
    Serial2.begin(9600);
    Serial.begin(9600);
    pinMode(14,OUTPUT); // пин для переключения при

    }

    void loop() {
      // put your main code here, to run repeatedly:
    byte buf[7]={0x02,0x54,0x3F,0xF5,0x27,0x7A,0xB6};
    delay(1000);
    digitalWrite(14,HIGH);
    delay(100);

    Serial2.write(buf,7);
    byte i =0;
    delay(8); // самый важный delay
    digitalWrite(14,LOW);
    delay(200);

    if (Serial2.available() > 0) {  //если есть доступные данные
           while (Serial2.available()) {
           Serial.print(Serial2.read());    
          }
         }

    delay(1000);

    }
     
    Daniil и b707 нравится это.
  20. parovoZZ

    parovoZZ Гуру

    с жуткими делеями???