Arduino зависает, если питание отключено от HMI

У меня есть Arduino (Pro Mini), подключенный к дисплею HMI через последовательный порт. Когда пользователь нажимает кнопку на экране HMI, он активирует реле, подключенное к одному из цифровых контактов Arduino.

Из соображений безопасности, если Arduino потеряет связь с HMI, я хочу, чтобы он отключил реле. Таким образом, когда кнопка нажата, она запускает последовательность опроса, чтобы убедиться, что кнопка все еще нажата (я не полагаюсь на событие отпускания кнопки, опять же в целях безопасности).

Следующий код отлично работает, если я отключу одну из сигнальных линий (tx или rx) или землю от HMI. Однако если я отключу +5 В, Arduino полностью зависнет и, следовательно, никогда не отключит реле.

Что может быть причиной этого и что я могу сделать, чтобы решить эту проблему?

Код выглядит следующим образом, однако он работает должным образом, если линии передачи данных или заземление оборваны.

int getNumber(const char *reqString)
{
  sendString(reqString);

  long startTime = currentMillis;
  long waitTimer = currentMillis - startTime;

  bool responded = false;
  int endcount = 0;
  byte inbyte;
  byte bytebuffer[80];
  int bytecount = 0;

  while (waitTimer < 100 && !responded)
  {

      if (HMI.available())
      {
        inbyte = HMI.read();

        if (inbyte == 0xFF)
        {
          endcount++;
          if (endcount == 3)
          {
            responded = true;
            endcount = 0;
          }
        }
        else
        {
          endcount = 0;
        }

        bytebuffer[bytecount] = inbyte;
        bytecount++;
      }

      // Обновляем таймер ожидания.
      waitTimer = millis() - startTime;
  }

  // Если мы получили ответ, возвращаем первый байт данных. Если нет, верните 0
  if (responded)
   {
     Serial.println("Received response");
     return bytebuffer[1];
   }
   else
   {
 Serial.println("No response");
     return 0;
   }
}

, 👍3

Обсуждение

Чем больше времени я трачу на устранение неполадок, тем больше мне кажется, что это проблема с электричеством. Когда я отключаю питание от дисплея, он либо пытается получить питание, либо разрядить нагрузку через линии передачи данных. Как я уже сказал в посте, код работает, когда я отключаю линию передачи данных или землю., @Prdufresne

Можете ли вы выложить еще и схему?, @frarugi87

Сначала я создам схему. Проще говоря, Arduino и HIM подключены к общему настольному источнику питания 5 В постоянного тока. Линия HMI TX подключается к контакту 2, а линия HMI RX — к контакту 3., @Prdufresne

Я провел небольшое исследование. Похоже, что серийный номер программного обеспечения включает внутренний подтягивающий резистор, потому что я всегда читаю 5 В, когда к выводу ничего не подключено. С другой стороны, HMI, по-видимому, замыкает линию TX на землю, когда на нее нет питания. Вооружившись этим, я замкнул контакт RX (контакт 2) на Arduino на землю и получил тот же результат. Устройство зависает., @Prdufresne

Да, я думал, что это может быть так, но в коде нет места, которое фактически блокировало бы это, если только не происходит много изменений выводов. Проблема в том, что в «холостом» состоянии последовательного провода +5В (поэтому провод TX переходит на +5В). Прежде всего вам придется дважды проверить, что происходит, когда вы подаете 5 В на контакт обесточенного HMI (если он не защищен, вы также можете его сломать). Тогда вам понадобится способ справиться с тем фактом, что вы получаете недопустимое состояние простоя. Я вижу следующие решения: 1) не использовать SoftwareSerial 2) протянуть провод от HMI 5 В к Arduino и использовать его для [...], @frarugi87

[...] игнорировать условие ввода функции SoftwareSerial ISR ([здесь](https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/libraries/SoftwareSerial/src/SoftwareSerial.cpp ) — это исходный код библиотеки, и я упоминаю строку 146 — избегайте блокировки, если нет питания). 3) используйте что-нибудь (например, логические порты или PMOS), чтобы подключить провод RX к +5 В в случае потери питания на HMI., @frarugi87


1 ответ


Лучший ответ:

1

Похоже, что Software Serial ожидает «высокого уровня» на RX

Мне на ум приходит только аппаратное решение

schematic

Таким образом, Arduino RX будет выпущен при потере питания HMI

Изменить позже

Вы также можете использовать сторожевой таймер, чтобы разморозить код, если он не отвечает. Он перезагрузит Arduino, если wdt_reset() не будет вызван в течение определенного периода времени, и вы сможете выполнить необходимую очистку перед повторным использованием Software Serial. Вот полезное руководство.

,