покажи как читаешь через уарт
20мсек - это 20 милисекунд - длина 1 бита ? - так скорость порта тогда вроде как скорость порта тогда 50 бод - не ?
#include <SoftwareSerial.h>
// Настройки SoftwareSerial
#define UART_RX_PIN 25
#define UART_BAUD_RATE 9600 // Проверьте скорость UART, измените при необходимости
SoftwareSerial mySerial(-1, UART_RX_PIN); // RX = 25, TX не используется (-1)
// Переменные для хранения состояния дверей
bool doors[5] = {false, false, false, false, false}; // Хранит состояние 5 дверей (0 - закрыта, 1 - открыта)
// CRC проверка (проверяем целостность данных)
bool checkCRC(uint8_t data) {
uint8_t crc = (data >> 5) & 0b111; // Извлекаем CRC (последние 3 бита)
uint8_t payload = data & 0b11111; // Извлекаем 5 бит данных
uint8_t calculatedCRC = 0;
// Рассчитываем CRC (простая чётность по данным)
for (uint8_t i = 0; i < 5; i++) {
if (payload & (1 << i)) {
calculatedCRC++;
}
}
calculatedCRC %= 8; // Оставляем только последние 3 бита
return crc == calculatedCRC;
}
// Разбор данных
void parseData(uint8_t data) {
for (uint8_t i = 0; i < 5; i++) {
doors[i] = (data >> i) & 0x01; // Извлекаем каждый бит данных
}
}
void setup() {
Serial.begin(115200); // Отладочный порт
mySerial.begin(UART_BAUD_RATE); // Инициализация SoftwareSerial
Serial.println("Начало работы...");
}
void loop() {
if (mySerial.available() > 0) {
uint8_t incomingByte = mySerial.read(); // Считываем 1 байт
// Проверяем корректность данных
if (checkCRC(incomingByte)) {
parseData(incomingByte); // Разбираем данные, если CRC верна
// Выводим состояние дверей
Serial.print("Состояние дверей: ");
for (uint8_t i = 0; i < 5; i++) {
Serial.print(doors[i] ? "Открыта " : "Закрыта ");
}
Serial.println();
} else {
Serial.println("Ошибка CRC! Неверные данные.");
}
}
}