rs485 - бьётся сообщение...

Тема в разделе "Arduino & Shields", создана пользователем zserg, 24 июн 2017.

  1. zserg

    zserg Нерд

    Всем привет!
    Соединяю arduino mini и Wemos D2 по rs485. От ардуины - через RX/TX, от wemos - SoftwareSerial. Везде 9600. Использую платки max485. И вроде бы бегает... Но КАЖДЫЙ 9-й байт бьётся. Вот пример:
    Чуть-чуть меняем сообщение, и получаем:
    Чую, что где-то они с контролем чётности не договорились, но как её явно выставить-то? Ни в Serial, ни в SoftwareSerial не нашёл. Только скорость.

    Знатоки, подскажите, куда копать?

    PS: На ардуине SoftwareSerial поднять сложно - там все ноги заняты уже...
     
  2. а если скорость увеличить\уменьшить?
    SoftwareSerial он сильно глючный, если есть возможность, нужно использовать аппаратный
     
  3. sslobodyan

    sslobodyan Гик

    Точно каждый восьмой? По примеру и не скажешь. А напрямую без 485 пробовали? Для отсечения непоняток. Сообщения идут только в одну сторону, без переключения прием-передача?
     
  4. zserg

    zserg Нерд

    Да, ошибся :) Каждый 9-й. Напрямую не пробовал, пока переключений нет, но планируются. Вечером попробую снизить скорость и напрямую соединить тоже.
     
  5. zserg

    zserg Нерд

    Фух. Попробовал и так и сяк. Если скорость ставить 4800, то всё ещё хуже. Бьётся чуть не каждый второй. Убрал SoftwareSerial, включил в аппаратный - те же яйца. Т.е. 9-й байт битый. Скорость аппаратного 9600. Может на rs485 чтой-то подкрутить?
     
  6. mcureenab

    mcureenab Гуру

    Может в буфере на прием - передачу косяк? Всякая там четность, это один - два байта и в принципе дальше поток срывается и валит мусор. А тут шибко далеко от начала и заплёван только один байт.
     
  7. mcureenab

    mcureenab Гуру

    Какой код у этого битого байта? В программе есть массивы? Указатели?
     
  8. mcureenab

    mcureenab Гуру

    Пробовали менять МК?
     
  9. zserg

    zserg Нерд

    Менять пока не пробовал. Массивов практически нет - буфера сообщений есть, конечно, но я там использую strcat, что довольно безопасно. Переполнений тоже нет, буфера часто сбрасываются, размер там с большим запасом.
    Кстати, возможно принимается-то нормально, а вот отсылается на log-сервер (использую MQTT) с ошибкой, попробую посмотреть в это место. Завтра поэкспериментирую и отпишусь.
     
  10. zserg

    zserg Нерд

    Разобрался :) Проблема была в этом куске кода:
    Код (C++):

      digitalWrite(DIRECTION, HIGH);
      delay(10);
      Serial.write(iobuf);
      delay(10);            // <-- проблема тут
      digitalWrite(DIRECTION, LOW);
     
    Т.е. тупо данные не успевали отправится, как отрубался передатчик. Как только повысил задержку до 100, всё стало отправляться.