Для передачи сигналов между платами на базе ATmega328P используйте аппаратный интерфейс UART. Настройте скорость обмена 9600 бод, если расстояние между устройствами не превышает 1-2 метра. При больших дистанциях увеличьте Baud Rate до 57600 или 115200, чтобы снизить влияние помех.
В коде инициализируйте Serial.begin() с одинаковыми параметрами на обоих контроллерах. Для проверки работоспособности отправьте символ ‘A’ и убедитесь, что второй модуль корректно его принимает. Используйте SoftwareSerial, если аппаратные UART заняты другими периферийными устройствами.
Обмен данными между микроконтроллерами по UART
Настройка аппаратного интерфейса
Пример кода для передачи и приема
Для отправки символа с первого модуля:
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.write('A');
delay(1000);
}
На втором модуле добавьте обработку входящих данных:
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available()) {
char received = Serial.read();
// Действия с полученным символом
}
}
Подключение микроконтроллеров по UART
Добавьте резисторы 220 Ом последовательно с линиями передачи, если контроллеры питаются от разных источников. Для изоляции цепей примените оптопары (например, PC817) или преобразователи уровня (MAX3232 для RS-232, MAX485 для RS-485).
Отключите все устройства от COM-порта при монтаже. Проверьте целостность проводников мультиметром в режиме прозвонки. Длина проводов не должна превышать 1 метр без экранирования.
Обмен сообщениями по UART
Для передачи данных между микроконтроллерами используйте Serial.write() и Serial.read(). Пример отправки числа с первой платы:
void setup() {
Serial.begin(9600);
}
void loop() {
int value = analogRead(A0);
Serial.write(value >> 8); // Старший байт
Serial.write(value & 0xFF); // Младший байт
delay(100);
}
Приём на второй плате
Для чтения двухбайтового значения:
- Проверьте доступность данных
Serial.available() >= 2 - Прочитайте байты в правильном порядке
void loop() {
if (Serial.available() >= 2) {
byte highByte = Serial.read();
byte lowByte = Serial.read();
int result = (highByte << 8) | lowByte;
}
}
Ошибки и решения
- Разная скорость: Убедитесь, что оба устройства используют одинаковый baud rate (9600, 115200 и т.д.)
- Потеря байтов: Добавьте проверку контрольной суммы или таймаут между пакетами
- Буфер переполнен: Увеличьте размер буфера в
HardwareSerial.hпри необходимости
Для текстовых данных используйте Serial.parseInt() или парсинг с разделителями:
if (Serial.available()) {
String input = Serial.readStringUntil('
');
int number = input.toInt();
}
Физическое подключение: провода и распиновка
Для соединения микроконтроллеров TX одного устройства подключается к RX другого, а RX – к TX. На платах с логикой 3.3 В убедитесь, что уровни сигналов совместимы, иначе используйте преобразователь.
Распиновка UART
На Uno и Nano контакты для обмена данными:
- Pin 0 (RX) – принимает информацию.
- Pin 1 (TX) – отправляет.
Настройка контактов
В коде инициализируйте интерфейс командой Serial.begin(9600). Для изменения скорости передачи подберите одинаковое значение на обоих устройствах. Если используются программные реализации, укажите номера пинов в SoftwareSerial.
Проверьте целостность проводников мультиметром. Длина соединения не должна превышать 1–2 м без экранирования.


