Общение двух Atmega328p по COM порту

Тема в разделе "Arduino & Shields", создана пользователем Rauf, 6 окт 2016.

  1. Rauf

    Rauf Нерд

    Здравствуйте уважаемые форумчане.

    Так как я начинающий в этом деле прошу не бронить меня.

    Мне необходима Ваша помощь в создании связи между двух Atmega328p.

    Задача состоит в следующем. Два помещения находятся на расстоянии 300 метров между которыми есть холостая витая пара. В помещении первом стоит одна Atmega328p настроенная на приём 8 событий, вторая же Atmega328p на приём и информирование о событиях в первом помещении. Я настроил оба контроллера и они общаются между собой через COM по RX/TX пинам, после завершения пилотирования поставлю RS485.

    Логика и схема такова:

    1 – контроллер –

    · 8 пинов на вход событий

    · 1 пин лед отклик от второго устройства что он не завис

    · 1 пин переключение режима на RS485

    2 – Контроллер

    · 8 пинов леды информирующие о сработке на первом контроллере

    · 1 пин лед отклик от первого устройства что он не завис

    · 1 пин кнопка при нажатии которого посылается код опроса первого устройства на котором 3 раза моргнёт лед и вернётся код об успешном отклике, затем 3 раза маргнёт лед на втором устройстве.

    · 1 пин пищалка в случае любого события на первом контроллере пищит

    · 2 пина LED дисплей 16х2 по I2C на котором тоже высвечивается информация о сработке.



    ЛОГИКА:

    ДЕЙСТВИЕ СРАБОТКА

    1 Контроллер – в случае сработки посылает в COM букву или цифру соответствующую данному действию.

    2 Контроллер приняв букву выполняет действия (зажигает лед, пищит, пишет на экране)

    Точно также происходит выключение действия.



    ДЕЙСТВИЕ ПРОВЕРКА СВЯЗИ

    Только со второго контроллера по нажатию кнопки отправляется буква в серийный порт на который реагирует первый контроллер трёх разовым морганием и ответом в порт буквой и соответственно на втором тоже начинает мигать лед 3 раза и уже становится ясно что связь есть и контроллер не завис.



    В чём нужна Ваша помощь:

    1 – для избежания ложных сработок при помехах на линии которая будет 300 метров я дописал в коде чтобы каждое событие пересылалось 3 раза подряд, но хочу чтобы на втором контроллере происходило суммирование и сверка затем одно действие.

    Например – пришло событие: B B B - где каждое B это отдельная команда принта в серийный порт, а второй контроллер приняв данное сообщение соединил их в одно значение “BBB” и выполнил условие как у меня сейчас выставлено на одну “B”.

    2 – скорее всего я пытаюсь изобрести колесо и всё уже есть и работает но я не смог найти подходящий мне вариант. Как быть если была сработка а ВВВ дошло повреждённым например «ВАА»? как создать условие если пришло что то что не совпадает ни с одной из 16 команд заного запросить событие с первого устройства?

    3 – можно ли сделать мануальный или циклический опрос портов на первом устройстве со второго устройства?
     

    Вложения:

  2. rkit

    rkit Гуру

    На 300 метров советую поставить скорость связи совсем мизерную, в районе 100-200 бод.
    По поводу 2 советую не страдать фигней, а сначала проверить качество связи, а потом уже решать по поводу ошибок.
    По поводу 3 можно, не вижу в чем проблема. Устройство 2 говорит "дай мне состояние порта1", потом "порта2", и так далее. За вас код написать, что ли?
     
  3. Rauf

    Rauf Нерд

    Уважаемый rkit большое спасибо что отреагировали. Прошу Вас дать пример как это необходимо написать? Только ту часть как сложить 3 символа в одно слово: например пришло поочерёдно 3 раза А как их приплюсовать чтобы получилась переменная ААА и при получении новых символов чтобы переменная принимала новые значения например в след за ней пришло 3 раза Х, ААА уже отработало своё действие теперь очередь соединить ХХХ и выполнить другое действие. За ранее благодарю.
     
  4. rkit

    rkit Гуру

    Если совсем просто, то так
    Код (C++):

    char read() {
      char a = Serial.read()
      char b = Serial.read()
      char c = Serial.read()
      if (a == b && b == c) {
        return a; // успех
      } else {
        return -1; // ошибка
      }
    }
     
    Но это все равно не слишком хорошая система коррекции ошибок. Если вместо поврежденной буквы не придет совсем ничего, то все поедет.
     
    Rauf нравится это.
  5. Rauf

    Rauf Нерд

    Как я понимаю мне ещё нужно прописать подтверждение о совпадении и отправки на первое устройство его или иначе о не совпадении и повторного запроса отправленного сообщения?
     
  6. rkit

    rkit Гуру

    Естественно.
     
  7. Rauf

    Rauf Нерд

    Вам огромное спасибо!
    return a;// успех
    как я понимаю у него будет значение одного А а не ААА

    Код (C++):
    char read() {
      char a = Serial.read()
      char b = Serial.read()
      char c = Serial.read()
      if (a == b && b == c) {
        E == a+b+c
        return E ; // успех
      } else {
        return -1; // ошибка
      }
    }
    Может нужно ещё объявить переменную значение которой ровнялось бы (e == a+b+c )?
     
  8. rkit

    rkit Гуру

    В ней все буквы будут гарантированно одинаковые, а значит нет никакой нужды их дуплировать.
     
  9. Rauf

    Rauf Нерд

    Код (C++):
    if(Serial.available()>0)
      {
        char letter = Serial.read();

         char a = Serial.read()
         char b = Serial.read()
         char c = Serial.read()
         if (a == b && b == c) {
         return a ; // успех
      } else {
        return -1; // ошибка
      }

     
         if (a == '0')
           {
       
             SobitieAHigh();
           }
         else if (a == '1')
           {
            SobitieALow();
           }
     
    Последнее редактирование: 6 окт 2016
  10. Rauf

    Rauf Нерд

    Очень прошу проверить правильно ли я вставил Ваш код?
     
  11. rkit

    rkit Гуру

    Нет, совсем не правильно.
    Код (C++):
    if(Serial.available()>3)
      {
        char letter = read();
     
         if (letter == '0')
           {
       
             SobitieAHigh();
           }
         else if (letter == '1')
           {
            SobitieALow();
           }
    Но если честно, то не похоже, что вообще есть хоть какое-то понимание кода. Я тут уже бессилен. Надо начинать учиться с чего-нибудь попроще.
     
  12. Rauf

    Rauf Нерд

    Я полностью согласен я начинающий в этом деле. но тот код который в файлах прикреплён полностью работает. И конечно есть люди которые могут написать грамотно и улучшить алгоритм работы программы. Но как прописать Ваш код в мой?

    Код (C++):
    if(Serial.available()>0)
      {
        char letter = Serial.read();

        if (letter == '0')
        {
         
          SobitieAHigh();
        }
        else if (letter == '1')
        {
          SobitieALow();
        }


    //-------------------------------------------------------------------------------
        if (letter == '2')
        {
          SobitieBHigh();
        }
        if (letter == '3')
        {
          SobitieBLow();
        }
    //-------------------------------------------------------------------------------
        if (letter == '4')
        {
          SobitieCHigh();
        }
        if (letter == '5')
        {
          SobitieCLow();
        }
     
  13. Rauf

    Rauf Нерд

    Правильно ли такое написание?

    Код (C++):
     if(Serial.available()>0)
      {
        char read() {
          char a = Serial.read()
          char b = Serial.read()
          char c = Serial.read()
        if (a == b && b == c) {
          return a ; // успех
          a == letter
            if (letter == '0')
            {
               SobitieAHigh();
            }
            else if (letter == '1')
            {
               SobitieALow();
            }
        }
          else {
          return -1; // ошибка
        }
      }
     
  14. rkit

    rkit Гуру

    Нет. Советую найти в интернете книгу по программированию на языке C++, и прочитать ее, хотя бы первые 100 страниц.
     
  15. Rauf

    Rauf Нерд

    В том что нужно мне учиться нет сомнения, обязательно почитаю. Но мне нужна помощь до прочтения книг, сомневаюсь что ученные обращаются за помощью. Это те кто читал и умеет помогают тем кто начинает.
    Если вы знаете и не хотите помочь это другой разговор, вы не обязаны но напрашивается вопрос зачем вам сидеть в форуме если советуете читать книги? Форум это прежде всего рука помощи. Большое Вам спасибо буду ждать чтобы кто либо ещё откликнулся на зов помощи.
     
  16. Rauf

    Rauf Нерд

    Уважаемые форумчане можно ли воспользоваться таким написанием?
    Код (C++):
      if(Serial.available()>0)
      {
        char letter[3] = Serial.read();

        if (letter == "000")
        {
         
          SobitieAHigh();
        }
        else if (letter == "111")
        {
          SobitieALow();
        }
     
    char letter[3] ----- будет ли плюсовать по три символа пришедших в порт?
     
  17. rkit

    rkit Гуру

    Я советую читать книгу потому, что это правильное решение в данный ситуации.
     
  18. Rauf

    Rauf Нерд

    Я знаю что правильное но на это уйдёт много времени может месяцы. И получив помощь сейчас это не означает что я не буду читать и просвещаться. Несомненно буду сидеть и учить но мне нужно решить данную проблему как можно скорее. Если есть желание помогите. Если нет то не буду навязываться. Всё нормально я до 35 дожил понимаю многих.
     
  19. rkit

    rkit Гуру

    [​IMG]
     
    Cynep нравится это.
  20. Airbus

    Airbus Радиохулиган Модератор

    А зачем 300 метров по проводам?Дорого же!Да и омическое сопротивление будет огромное!В 21 веке живём есть же беспроводные технологии и подешевле и подороже. Здесь описаны все варианты взаимодействия двух/трёх/пяти Ардуин.