цифровая электроника
вычислительная техника
встраиваемые системы

 
» » » Управляем 14-ю устройствами с RS-232 с помощью одной платы Arduino


Управляем 14-ю устройствами с RS-232 с помощью одной платы Arduino

Автор: Mike(admin) от 7-05-2019, 05:55

С помощью Arduino можно управлять довольно большим количеством (до 14) устройств с портом RS-232, и в данном примере будет показано, как это сделать.


Управляем 14-ю устройствами с RS-232 с помощью одной платы Arduino

Для управления 14-ю устройствами с RS-232 нам понадобятся 14 плат PES-2606. PES-2606 - это простая в использовании плата расширения RS-232 для Arduino Uno и Mega, которая позволяет Arduino обмениваться данными с последовательным устройством через RS-232.


Управляем 14-ю устройствами с RS-232 с помощью одной платы Arduino

В частности, 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.


Управляем 14-ю устройствами с RS-232 с помощью одной платы Arduino

Код программы Arduino предполагает следующее. Мы считываем данные с каждой платы RS-232 а затем распечатываем эти данные в последовательном мониторе с идентификатором платы (адресом платы). Также мы отправляем фрейм данных из последовательного монитора Arduino. Формат фрейма: ID_платы + ":" + данные + разделитель кадров.


Управляем 14-ю устройствами с RS-232 с помощью одной платы Arduino


#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


Теги: Arduino, RS232




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий