считывание данных с контроллера через RS485 Modbus rtu Arduino
У меня есть устройство с портом rs485, с которого я хотел бы считывать значение рн. Ниже приведено соединение с адаптером RS485.
Я попытался прочитать данные с помощью этого кода, но ничего не вышло:
#include SoftwareSerial.h
#define SSerialRX 10 //Serial Receive pin
#define SSerialTX 11 //Serial Transmit pin
#define SSerialTxControl 3 //RS485 Direction control
#define RS485Transmit HIGH
#define RS485Receive LOW
#define Pin13LED 13
SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX
byte byteSend;
byte request[] = {0, 0x03, 0, 0, 0, 0x01, 0x85, 0xDB};
void setup()
{
// Start the built-in serial port, probably to Serial Monitor
Serial.begin(9600);
Serial.println("SerialRemote"); // Can be ignored
pinMode(Pin13LED, OUTPUT);
pinMode(SSerialTxControl, OUTPUT);
digitalWrite(SSerialTxControl, RS485Receive); // Init Transceiver
RS485Serial.begin(9600);
delay(2000);
RS485Serial.write(request, sizeof(request));
digitalWrite(Pin13LED, LOW);
delay(10);
digitalWrite(SSerialTxControl, RS485Receive);
}
void loop()
{
if (RS485Serial.available())
{
byteSend = RS485Serial.read(); // Read the byte
Serial.print(byteSend, HEX);
Serial.print(" ");
}
}
Не могли бы вы мне помочь? Спасибо
@faustolev, 👍0
Обсуждение2 ответа
Я не могу сказать, ваша это проблема или нет, но мне не нравится этот кусочек кода:
RS485Serial.write(request, sizeof(request));
digitalWrite(Pin13LED, LOW);
delay(10);
digitalWrite(SSerialTxControl, RS485Receive);
Вы отправляете запрос, затем ждете 10 мс и переключаетесь в режим приема. Это может быть достаточной задержкой, но трудно сказать (в лучшем случае 960 бит / с при скорости 9600 бод дает около 1 мс на байт, что составляет 8 мс для запроса, но с последовательным программным обеспечением это может быть не так просто).
Вместо этого вы должны использовать метод flush
класса Stream для ожидания передачи данных:
RS485Serial.write(request, sizeof(request));
digitalWrite(Pin13LED, LOW);
RS485Serial.flush();
digitalWrite(SSerialTxControl, RS485Receive);
тот же результат: последовательный монитор показывает "FF" в каждом цикле., @faustolev
Вероятно, необходимо вызвать " digitalWrite(SSerialTxControl, RS485Transmit);", чтобы включить буфер TX перед записью данных в порт., @SoreDakeNoKoto
Извините, что разбудил старую тему. Но не следует:
digitalWrite(SSerialTxControl, RS485Receive); // Приемопередатчик ввода (ПРИМЕЧАНИЕ: должна передаваться по RS485)
быть ценным в первый раз? Прежде чем позвонить:
RS485Serial.write(request, sizeof(request));
- Основная связь Arduino ModBus RTU с проблемой измерителя мощности
- Мониторинг контроллера Modbus RTU с помощью Arduino и модуля RS485
- Связь Arduino Uno и ESP32 с использованием RS485
- Управление VFD с помощью ModBus RTU через RS485 и Arduino
- Использование Modbus-RTU с Arduino и контроллером температуры
- Подключить датчик постоянного тока 12 В к Arduino UNO с помощью TTL RS485
- Controllino Mega и ЧМИ Fatek
- Связь Arduino master/slave с использованием RS485
Вы не обеспечиваете питание интерфейса RS485?, @Majenko
да, я обеспечил питание от arduino +5v gng (отсутствует в изображении извините), @faustolev
Можете ли вы расширить на "не работает"? Кроме того, у вас есть схема данных для вашего датчика pH?, @Majenko
объясните байты запроса, пожалуйста., @Juraj
это тот же самый случай of:https://arduinoprosto.ru/q/50645/modbus-rtu-controller-monitoring-with-arduino-and-rs485-module, @faustolev
Согласно производителю контроллера, мы должны работать следующим образом: Отправлено компьютером : 00 03 00 00 00 01 85 ДБ Возврат от контроллера : 00 03 02 02 AE 05 58, @faustolev