С помощью Arduino можно управлять довольно большим количеством (до 14) устройств с портом RS-232, и в данном примере будет показано, как это сделать.
Для управления 14-ю устройствами с RS-232 нам понадобятся 14 плат PES-2606. PES-2606 - это простая в использовании плата расширения RS-232 для Arduino Uno и Mega, которая позволяет Arduino обмениваться данными с последовательным устройством через RS-232.
В частности, Arduino не использует контакты UART для связи с платой расширения RS-232. Поэтому пользователи могут использовать выводы Arduino UART для других целей. Кроме того, один Arduino Uno / Mega может связываться с несколькими платами расширения RS-232 (до 14) без использования выводов Arduino UART. Плата PES-2606 адресуется по идентификатору (ID), который можно установить вручную, установив DIP-переключатель.
В данном проекте мы сложим в стек 14 штук плат PES-2606 и подключим их к Arduino. Платы PES-2606 адресуются от 1 до 14.
Код программы Arduino предполагает следующее. Мы считываем данные с каждой платы RS-232 а затем распечатываем эти данные в последовательном мониторе с идентификатором платы (адресом платы). Также мы отправляем фрейм данных из последовательного монитора Arduino. Формат фрейма: ID_платы + ":" + данные + разделитель кадров.
#include <Phpoc.h>
#include <PhpocExpansion.h>
ExpansionSerial rs232_01(1);
ExpansionSerial rs232_02(2);
ExpansionSerial rs232_03(3);
ExpansionSerial rs232_04(4);
ExpansionSerial rs232_05(5);
ExpansionSerial rs232_06(6);
ExpansionSerial rs232_07(7);
ExpansionSerial rs232_08(8);
ExpansionSerial rs232_09(9);
ExpansionSerial rs232_10(10);
ExpansionSerial rs232_11(11);
ExpansionSerial rs232_12(12);
ExpansionSerial rs232_13(13);
ExpansionSerial rs232_14(14);
#define BUFFER_SIZE 100
byte serial_buf[BUFFER_SIZE]; // считывание буфера
int buf_len = 0;
void setup() {
Serial.begin(115200);
while(!Serial)
;
Sppc.begin(PF_LOG_SPI | PF_LOG_NET);
Expansion.begin();
rs232_01.begin(F("115200N81N"));
rs232_02.begin(F("115200N81N"));
rs232_03.begin(F("115200N81N"));
rs232_04.begin(F("115200N81N"));
rs232_05.begin(F("115200N81N"));
rs232_06.begin(F("115200N81N"));
rs232_07.begin(F("115200N81N"));
rs232_08.begin(F("115200N81N"));
rs232_09.begin(F("115200N81N"));
rs232_10.begin(F("115200N81N"));
rs232_11.begin(F("115200N81N"));
rs232_12.begin(F("115200N81N"));
rs232_13.begin(F("115200N81N"));
rs232_14.begin(F("115200N81N"));
}
void loop() {
char byte;
String expansionIdString = "";
// Считать данные с RS-232 и распечатать на последовательном мониторе
if(rs232_01.available()) {
byte = rs232_01.read();
expansionIdString = "01";
} else if(rs232_02.available()) {
byte = rs232_02.read();
expansionIdString = "02";
} else if(rs232_03.available()) {
byte = rs232_03.read();
expansionIdString = "03";
} else if(rs232_04.available()) {
byte = rs232_04.read();
expansionIdString = "04";
} else if(rs232_05.available()) {
byte = rs232_05.read();
expansionIdString = "05";
} else if(rs232_06.available()) {
byte = rs232_06.read();
expansionIdString = "06";
} else if(rs232_07.available()) {
byte = rs232_07.read();
expansionIdString = "07";
} else if(rs232_08.available()) {
byte = rs232_08.read();
expansionIdString = "08";
} else if(rs232_09.available()) {
byte = rs232_09.read();
expansionIdString = "09";
} else if(rs232_10.available()) {
byte = rs232_10.read();
expansionIdString = "10";
} else if(rs232_11.available()) {
byte = rs232_11.read();
expansionIdString = "11";
} else if(rs232_12.available()) {
byte = rs232_12.read();
expansionIdString = "12";
} else if(rs232_13.available()) {
byte = rs232_13.read();
expansionIdString = "13";
} else if(rs232_14.available()) {
byte = rs232_14.read();
expansionIdString = "14";
}
if(expansionIdString != "")
{
Serial.print(expansionIdString.c_str());
Serial.print(':');
Serial.println(byte);
}
// Считаем фрейм данных с последовательного монитора и отправим на RS-232. Разделитель кадров - символ новой строки
if(Serial.available()) {
byte = Serial.read();
serial_buf[buf_len] = byte;
buf_len++;
if(byte == 10) {
char digit_st = serial_buf[0];
char digit_nd = serial_buf[1];
expansionIdString = String(digit_st) + String(digit_nd);
int expansion_id = expansionIdString.toInt();
for(int i = 0; i < buf_len; i++) {
char buf_byte = serial_buf[i];
if(expansion_id == 1)
rs232_01.print(buf_byte);
else if(expansion_id == 2)
rs232_02.print(buf_byte);
else if(expansion_id == 3)
rs232_03.print(buf_byte);
else if(expansion_id == 4)
rs232_04.print(buf_byte);
else if(expansion_id == 5)
rs232_05.print(buf_byte);
else if(expansion_id == 6)
rs232_06.print(buf_byte);
else if(expansion_id == 7)
rs232_07.print(buf_byte);
else if(expansion_id == 8)
rs232_08.print(buf_byte);
else if(expansion_id == 9)
rs232_09.print(buf_byte);
else if(expansion_id == 10)
rs232_10.print(buf_byte);
else if(expansion_id == 11)
rs232_11.print(buf_byte);
else if(expansion_id == 12)
rs232_12.print(buf_byte);
else if(expansion_id == 13)
rs232_13.print(buf_byte);
else if(expansion_id == 14)
rs232_14.print(buf_byte);
}
buf_len = 0;
}
}
}
© digitrode.ru