Проблема связи Arduino UNO и RS485

Я изучаю Arduino, новичок в программировании. Я хочу использовать Arduino UNO для подключения датчика направления ветра RS485. Проблема заключается в том, что выход в последовательном мониторе, возвращаемые данные от датчика направления ветра нестабильны.

Мне нужно получить возвращенные данные от датчика направления ветра, чтобы получить направление ветра. Из заводского руководства они сказали, что отправили данные датчику: 0x01 0x03 0x00 0x00 0x00 0x02 0xC4 0x0B, и датчик вернется, как 0x01 0x03 0x04 0x06 0x48 0x00 0xA0 0x7A 0xD5

Направление ветра dat в вышеуказанных 5 и 6 положениях, 0x00 0xA0 => 00A0H(HEX)=160 градусов.

Инструменты: Плата Arduino Uno

Датчик Направления Ветра http://www.jnrsmcu.com/equipment/299.html

Плата RS485 (3,3 В) https://www.waveshare.com/rs485-board-3.3v.htm

Следующее мое кодирование:

#include <SoftwareSerial.h>

SoftwareSerial RS485Serial(10, 11); // RX, TX

void setup()
{
    RS485Serial.begin(4800);   // set the data rate
    Serial.begin(4800);
    Serial.println("Start");

    pinMode(12, OUTPUT);
    digitalWrite(12, HIGH);  // Init Transceiver
}

byte buf[8];

int byteReceived;

void loop()
{
    digitalWrite(12, HIGH);

    byte wind[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x0B};
    RS485Serial.write(wind, sizeof(wind));
    Serial.flush();
    RS485Serial.flush();
    // Serial.print(wind[0], HEX);
    Serial.println("Send");

    digitalWrite(12, LOW);
    delayMicroseconds(200);

    RS485Serial.readBytes(buf, 8);
    delay(10);
    Serial.println(buf[0], HEX);
    Serial.println(buf[5], HEX);
    Serial.println(buf[6], HEX);
    Serial.flush();
    RS485Serial.flush();
    delay (1000);
}

Карта подключения:

, 👍2

Обсуждение

Есть ли какая - либо документация на английском языке для этого датчика?, @Edgar Bonet

Вероятно, дело в том, что SoffwareSerial не может достаточно быстро реагировать на поступающие данные вовремя. Вы должны подключить логический анализатор и проверить, действительно ли посылаемые данные отличаются от данных, которые вы получаете. Если это так, то вам действительно нужно использовать плату разработки с аппаратным UART, который вы можете использовать. Я бы никогда не рекомендовал использовать SoftwareSerial для чего-либо, никогда. Период. Восклицательный знак., @Majenko

Вы можете использовать SoftwareSerial для отправки исходящего пакета, а аппаратный UART-как для получения ответа (на RX), так и для разговора с ПК (на TX). Может быть, это и не элегантно, но должно быть более надежно, чем пытаться читать из SoftwareSerial., @Edgar Bonet

@Majenko порекомендуйте нам, вашим пеонам, хорошо продуманный тактический бюджетный логический анализатор (случай не нужен), @user2497

Я использую маленький USB-ключ, который я получил от Alibaba или где-то за 5 долларов..., @Majenko


2 ответа


1

Я бы посоветовал вам упростить настройку до такой степени, чтобы у вас была "рабочая базовая конфигурация", а затем начать создавать систему по одному шагу за раз оттуда.

Начните с устранения интерфейса SoftwareSerial как возможного источника проблемы. Получите Arduino Mega с несколькими аппаратными последовательными портами.

Затем убедитесь, что вы можете отправлять символы на выбранный последовательный порт оборудования и получать те же символы обратно, когда линии Txn и Rxn ("n" здесь-номер выбранного последовательного порта оборудования) подключены через соединительный провод. Это называется конфигурацией "обратной связи" и является основным методом устранения неполадок последовательной связи (последовательные порты программного обеспечения не поддерживают одновременную передачу и прием, поэтому они не поддерживают тестирование обратной связи). Не продолжайте, пока вы не завершите этот шаг успешно.

Затем получите второй модуль RS-485 и расширьте свою предыдущую конфигурацию "обратной связи" с помощью аппаратного последовательного порта на Mega, чтобы включить два модуля RS-485. Затем вы должны иметь возможность отправлять символы в один модуль RS-485 и получать те же символы обратно от другого, подключив TXn к DI на одном из двух модулей RS-485, а Rxn - на другом.

На этом этапе вы проверите все коммуникационные соединения, поэтому можете быть уверены, что все, что вы отправите, действительно появится в порту DO RS-485, а все, что появится в порту DI RS-485, действительно вернется на вашу последовательную консоль. Теперь вы можете подключить датчик и выяснить, какие проблемы возникают с форматированием данных, последовательностями команд и тому подобным.

Этот базовый метод "разрезания проблемы пополам" будет работать в любой системе, большой или маленькой, простой или сложной.

Фрэнк

,

0
  • Я не вижу никакой связи между GND датчика и вашим Arduino. Это, вероятно, проблема, если они не подключены, так как общий GND необходим даже для RS-485.
  • Проверьте источник питания датчика, убедитесь, что он действительно находится в пределах рекомендованного диапазона 10-30 В. Также проверьте полярность дифференциальных линий.
  • Вы пробовали использовать прилагаемое программное обеспечение для настройки?
  • функция flush() ничего не делает для портов SoftwareSerial, поскольку у них нет буфера TX, поэтому вы можете просто избавиться от этих строк, включая ненужный Serial.flush()
  • Наконец, в таблице данных вашего устройства указано, что перед проверкой ответа следует подождать не менее 200 миллисекунд, а не микросекунд. Хотя это действительно не должно иметь значения, так как после этого вы используете readBytes (), который по умолчанию все равно ждет секунды, прежде чем сдаться. Вместо этого используйте буфер большего размера, скажем, 20 байт, а затем попробуйте прочитать в него только 8 (ожидаемая длина) с помощью readBytes():

    byte buf[20];
    int rlen = RS485Serial.readBytes(buf, 8);
    

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

,