Помогите правильно отправить команду по rs-485

suomi
suomi аватар
Offline
Зарегистрирован: 08.04.2018

Всем привет, сразу скажу, что я начинающий)

Прочитал как-то уже давно статью, в которой парень купил счетчик электроэнергии на алике, с которого по rs-485 можно снимать показания чего захочешь, только нужную команду отправь. Мне такая штука понравилась и я себе такой счетчик тоже приобрел. Заодно заказал rs-485 to TTL конвертер для ардуины и rs-485 to USB для компа.

http://adatum.ru/podklyuchenie-konvertera-rs-485-v-ttl-k-arduino.html - подключил к arduino как написано здесь.

Короче, ситуация такая: если посылать команды на счетчик с терминала компа, а ардуину использовать как приемник, то данные в нее приходят те, что отправлены с компа и те, что отправляет счетчик. 

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

Но когда я пытаюсь эти же байты нужной команды передать в счетчик, то счетчик их, как я понимаю, не воспринимает, потому что молчит, в ответ ничего не приходит.

Так что я подозреваю, что как-то неправильно отсылаю свои байты через Serial.write().

Вот, что в окне терминала

Посмотрите пожалуйста на код, который я использую, в моем понимании он правильно работает, но на практике это не так... Дайте совета, пожалуйста))

#define SerialTxControl 10   //RS485 управляющий контакт на arduino pin 10
#define RS485Transmit    HIGH
#define RS485Receive     LOW

byte totalEnergy[8] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x0B};
//byte currentFrequency[8] = {0x01, 0x03, 0x00, 0x11, 0x00, 0x01, 0xC4, 0x0B};

void setup(void) {
  Serial.begin(9600);
  pinMode(SerialTxControl, OUTPUT);
  digitalWrite(SerialTxControl, RS485Receive);
}

void loop(void) {
  digitalWrite(SerialTxControl, RS485Transmit );
  Serial.write(totalEnergy, sizeof(totalEnergy));
  delay(100);
  digitalWrite(SerialTxControl, RS485Receive);
  delay(500);
    if(Serial.available() > 0){
      Serial.print(Serial.read(), HEX);
      Serial.print(" ");
    }
}

 

suomi
suomi аватар
Offline
Зарегистрирован: 08.04.2018

Хмм... интересно. Я отцепил провод +5v от RS-485 конвертера, оставив только землю, и теперь в терминале виден ответ от счетчика на команды ардуины. НО в мониторе ардуины я не вижу аналогичный ответ... В чем может быть дело, почему это так работает? 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

suomi, в как по-Вашему, в каком качестве Вы используете Serial Ардуины, для связи со счетчиком или для отображения информации в мониторе?

MaksVV
Offline
Зарегистрирован: 06.08.2015

подключите  rs 485 к ардуино на Software Serial. А отображать информацию в монитор будете через Hardware Serial. 

#define SerialTxControl 9   //RS485 управляющий контакт на arduino pin 9
#define RS485Transmit    HIGH
#define RS485Receive     LOW

#include <SoftwareSerial.h>
SoftwareSerial RS_485(10, 11); // RX, TX



byte totalEnergy[8] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x0B};
//byte currentFrequency[8] = {0x01, 0x03, 0x00, 0x11, 0x00, 0x01, 0xC4, 0x0B};

void setup(void) {
  Serial.begin(9600);
  RS_485.begin(9600);
  pinMode(SerialTxControl, OUTPUT);
  digitalWrite(SerialTxControl, RS485Receive);
}

void loop(void) {
  digitalWrite(SerialTxControl, RS485Transmit );
  RS_485.write(totalEnergy, sizeof(totalEnergy));
  delay(100);
  digitalWrite(SerialTxControl, RS485Receive);
  delay(500);
    if(Serial.available() > 0){
      Serial.print(Serial.read(), HEX);
      Serial.print(" ");
    }
}

 

UserDead
UserDead аватар
Offline
Зарегистрирован: 29.11.2015

Дополню свои 5 копеек к вышеизложенному посту.

Ипользуя SoftwareSerial пин отвечающий за Rx (прием на дуню) на больших скоростях, должен быть на пине в котором есть аппаратное прерывание. Это описано было в самой библиотеке если не ошбаюсь. Это пины 2 и 3 на ардуине. Стараюсь ими пользоваться для ReceiveX

suomi
suomi аватар
Offline
Зарегистрирован: 08.04.2018

Большое спасибо всем за ответы. Честно говоря, до этого дня не знал ни о возможности эмулировать последовательный порт, ни о прерываниях в ардуине :)) Сейчас буду применять.