Программа
Как мы уже отмечали, если к линии подключены несколько устройств, то в один момент времени только одно из них может передавать данные. Получается, нам нужно каким-то образом сообщить всем соседям, что мы готовы к передаче, а они при этом должны молчать и слушать. Делается это при помощи контактов DE и RE. Если мы подаём высокий уровень на эти контакты, то устройство переходит в режим передатчика. Низкий уровень — приёмника.
Напишем две программы. Одна будет передавать в эфир текст «ping», каждые 500 мс. Другая будет слушать эфир и при получении текст «ping» — мигать светодиодом №13.
Программа передатчика
#define SerialTxControl 2 // контакт №2 будет переключать режим приёмник/передатчик
#define RS485Transmit HIGH
#define RS485Receive LOW
void setup(void) {
Serial.begin(9600); // настраиваем последовательный порт на скорость 9600бод
pinMode(SerialTxControl, OUTPUT);
digitalWrite(SerialTxControl, RS485Transmit); // переводим устройство в режим передатчика
}
void loop(void) {
Serial.print("ping"); // отправляем текст
delay(500);
}
Программа приёмника
#define SerialTxControl 2
#define RS485Transmit HIGH
#define RS485Receive LOW
char buffer[100];
byte state = 0;
void setup(void) {
Serial.begin(9600);
pinMode(13, OUTPUT);
pinMode(SerialTxControl, OUTPUT);
digitalWrite(SerialTxControl, RS485Receive); // переводим устройство в режим приёмника
}
void loop(void) {
int i=0;
if( Serial.available() ){ // если в порт пришли какие-то данные
delay(5); // немного ждём, чтобы вся пачка данных была принята портом
while( Serial.available() ){
buffer[i++] = Serial.read(); // считываем данные и записываем их в буфер
}
}
if(i>0){ // если в буфере что-то есть
buffer[i++]='\0'; // превращаем содержимое буфера в строку, добавляя нулевой символ
if( strcmp(buffer, "ping") ){ // если принятая строка равна тексту ping
digitalWrite(13, state); // мигаем светодиодом
state = !state;
}
}
}
Загружаем программы на обе платы и наблюдаем за происходящим. Если всё собрано верно, то после подачи питания, на второй плате начнет мигать светодиод, подключённый к выводу №13.
В этом примере, приёмник и передатчик не меняют своей роли на всём протяжении работы. Усовершенствуем программы и сделаем так, чтобы приёмник и передатчик менялись ролями в процессе работы.
Светодиод не мигает, хотя pjng приходит, проверено через монитор порта, функция сравнения почему-то не работает.
ping надо в одиночные кавычки, тогда все заработало
По стандарту полагается тянуть не только линии A и B, но и общий провод, подключая его через последовательный 100-омный резистор на каждом устройстве — это необходимо для уравнивания потенциалов, без него входы могут и погореть. Жаль, что на платке клеммник не имеет такой возможности. Не смертельно, конечно — можно и внешний поставить, а этот использовать для подключения терминатора.
Кстати, интересно: организовано ли смещение линий A и B? Этих модулей у меня пока нет, куплю — проверю.