Помогите правильно отправить команду по rs-485
- Войдите на сайт для отправки комментариев
Всем привет, сразу скажу, что я начинающий)
Прочитал как-то уже давно статью, в которой парень купил счетчик электроэнергии на алике, с которого по 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(" "); } }
Хмм... интересно. Я отцепил провод +5v от RS-485 конвертера, оставив только землю, и теперь в терминале виден ответ от счетчика на команды ардуины. НО в мониторе ардуины я не вижу аналогичный ответ... В чем может быть дело, почему это так работает?
suomi, в как по-Вашему, в каком качестве Вы используете Serial Ардуины, для связи со счетчиком или для отображения информации в мониторе?
подключите rs 485 к ардуино на Software Serial. А отображать информацию в монитор будете через Hardware Serial.
Дополню свои 5 копеек к вышеизложенному посту.
Ипользуя SoftwareSerial пин отвечающий за Rx (прием на дуню) на больших скоростях, должен быть на пине в котором есть аппаратное прерывание. Это описано было в самой библиотеке если не ошбаюсь. Это пины 2 и 3 на ардуине. Стараюсь ими пользоваться для ReceiveX
Большое спасибо всем за ответы. Честно говоря, до этого дня не знал ни о возможности эмулировать последовательный порт, ни о прерываниях в ардуине :)) Сейчас буду применять.