считывание данных с контроллера через 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(" ");
  }
}

Не могли бы вы мне помочь? Спасибо

, 👍0

Обсуждение

Вы не обеспечиваете питание интерфейса 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


2 ответа


0

Я не могу сказать, ваша это проблема или нет, но мне не нравится этот кусочек кода:

   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


0

Извините, что разбудил старую тему. Но не следует:

digitalWrite(SSerialTxControl, RS485Receive);  // Приемопередатчик ввода (ПРИМЕЧАНИЕ: должна передаваться по RS485)

быть ценным в первый раз? Прежде чем позвонить:

RS485Serial.write(request, sizeof(request));
,