Необходима задержка после Serial.read()

Я использую RedBear Duo для чтения последовательных записей из RedBear Nano v2. По сути, я использую цифровой вывод Duo для вызова прерывания на Nano. Как только nano перехватывает прерывание, он записывает на свой последовательный.

Минимальный рабочий пример вы можете найти ниже:

Дуэт RedBear

#include <Wire.h>

/*BLE and WiFi setup*/
#if defined(ARDUINO)
SYSTEM_MODE(MANUAL);
#endif

char incomingByte;   // для входящих последовательных данных

void setup() {
    Serial1.begin(115200);     // открывает последовательный порт, устанавливает скорость передачи данных 9600 бит/с
    delay(500);
    Serial1.println("Begin!");
    Serial2.begin(115200);

    pinMode(D5, OUTPUT);
}


void readSerial() {
    while (Serial2.available() > 0) {
        incomingByte = Serial2.read();
        Serial1.print(incomingByte);
    }
    Serial1.println(" ");

}

void loop() {
    digitalWrite(D5, HIGH);
    readSerial();
    delay(2);     // Вот о какой задержке я говорю
    digitalWrite(D5, LOW);
    delay(1000);
}

RedBear Nano

uint8_t fire;
void task_handle(void) {
    fire = 1;
}

void setup() {
    Serial.begin(115200);
    fire = 0;
    pinMode(D4, INPUT);
    attachInterrupt(D4, task_handle, RISING);
}

void loop() {
    if (fire == 1) {
        fire = 0;
        Serial.write("hello ");
        // Serial.println("fire");
        digitalWrite(D13, HIGH);
    }
    delay(150);
}

Я нашел этот вопрос (https://electronics.stackexchange.com/questions/28739/arduino-delay-of-1ms-necessary-between-serial-read-and-serial-write), и я понял, что проблема может заключаться в том, что для очистки последовательного буфера требуется некоторое время.

Однако я попытался установить скорость передачи данных 500000 (больше, чем в 3 раза), и все равно, если я изменю задержку на delay(1), код не выводит то, что он получил на последовательном порту.

Я пытаюсь понять, что на самом деле происходит и зачем мне нужна эта задержка(2).

Большое спасибо заранее!

, 👍1


2 ответа


Лучший ответ:

2

Попробуйте этот код: первая задержка создает импульс длительностью 1 мс на выводе D5. Без этой задержки импульс может быть слишком коротким для того, чтобы nano его поймал (вы можете использовать delayUs и попытаться найти самый короткий интервал, который даст надежный результат). Мы знаем, что после этого импульса nano отправляет некоторые данные. Поэтому подождите 100 мс, чтобы собрать их. Если вы вызовете readSerial сразу после отправки импульса, вы ничего не получите, потому что вам нужно дождаться хотя бы передачи одного байта

void loop() {
    digitalWrite(D5, HIGH);
    delay(1); 
    digitalWrite(D5, LOW);

    delay(100);
    readSerial();

    delay(1000);
}
,

1

Эта строка неверна:

attachInterrupt(D4, task_handle, RISING);

Это должно быть:

attachInterrupt (digitalPinToInterrupt (4), task_handle, RISING);

В любом случае, attachInterrupt не применяется к D4, он применяется к D2 и D3 на Atmega328P.

Обратите внимание, что номер контакта — 4, а не D4.

,