Возможно ли иметь два serialEvent() в коде Arduino?

Я разрабатываю код на Arduino, и мне нужно реализовать условие, согласно которому, если данные доступны в формате «serial2», тогда входные данные будут получены только для «последовательного» терминала Arduino.

Я пробовал использовать приведенный ниже код, но его поведение такое: когда я отправляю что-то с «последовательного» терминала Arduino, управление переходит в цикл «serialEvent()», в противном случае, даже если я отправляю данные через «serial2», это не входит в этот цикл.

Ниже приведен фрагмент моего кода:

void serialEvent() 
{
  int DATAaddressMSb, DATAaddressLSb;
  digitalWrite(DIR485, LOW);
  delay(100);
  delay(10);
  while (Serial2.available()>0)
  {
    Serial.println("serial2 data available");
    int i = 0;
    int bufferIn1[9] = { int(0x00), int(0x00), int(0x00), int(0x00), int(0x00), int(0x00), int(0x00), int(0x00), int(0x00) };
    bufferIn1[i] = Serial2.read();
    Serial.print(bufferIn1[i], DEC);
    Serial.print(" ");
    if(i == 0){Serial.print("BUFFER VAL 0");
    Serial.print( bufferIn1[i], DEC);}
    if(i == 1){Serial.print("BUFFER VAL 1");
    Serial.print( bufferIn1[i], DEC);}
    if(i == 2){Serial.print("BUFFER VAL 2");
    Serial.print( bufferIn1[i], DEC);}
    i++;
  }

  while (Serial.available()&& pos < sizeof my_str - 1) {
    char c = Serial.read();
    if (c == '\n') {            // \n означает "конец сообщения"
            my_str[pos] = '\0';     // завершаем буфер
            pos = 0;                // сброс к началу буфера
            String str((char*)my_str);    // конвертируем массив символов в строку
            if (str == "PCB-CODE") { Serial.println(SN_CODE); }
            if (str == "FW-VERSION") { Serial.println(FW_ver); }
            if (str == "STOP" ) { TESTcode = 0; IDcode = 999; }
            if (str == "TEST1") { TESTcode = 1; delay(6000); Serial.println("Enter ID "); }
            if (str == "TEST2") { Serial.println("Initialising Board ");  delay(6000); TESTcode = 2; }           // Для всех тестов

            if (str == "ID0") { IDcode = 999; }
            if (str == "ID1") { delay(60); IDcode = 1; }       // Проверка версии прошивки
            if (str == "ID2") { IDcode = 2; }       // Тест на 3,3 В
            if (str == "ID3") { IDcode = 3; }       // Проверка основного питания
            if (str == "ID4") { delay(50); IDcode = 4; }       // Проверка +15 В
            if (str == "ID5") { IDcode = 5; }       // Тест на +10В
            if (str == "ID6") { IDcode = 6; }       // Тест на +8В
            if (str == "ID7") { IDcode = 7; }       // Проверка +5,5 В
            if (str == "ID8") { IDcode = 8; }       // Проверка +1,2 В
            if (str == "ID9") { IDcode = 9; }       // Проверка +2,5 В
            if (str == "ID10") { IDcode = 10; }     // Тест на -15 В
            if (str == "ID11") { IDcode = 11; }     // Проверка POW_LIGHT
            if (str == "ID12") { IDcode = 12; }     // Проверка +s_stab
            if (str == "ID13") {delay(50); IDcode = 13; }     // Проверка +CELLA
            if (str == "ID14") { IDcode = 14; }     // Проверка FPGA_GPIO
            if (str == "ID15") { IDcode = 15; }     // Проверка DAC_OUT
            if (str == "ID16") { IDcode = 16; }     // Проверка CURRENT_LOOP
            if (str == "ID17") {delay(50); IDcode = 17; }     // Проверка сигнала крутящего момента
            if (str == "ID18") { IDcode = 18; }     // Проверка EXT_TRIGGER
            if (str == "ID19") { IDcode = 19; }     // Проверка кодировщика
            if (str == "ID20") { IDcode = 20; }     // Проверка оперативной памяти
            if (str == "ID21") { IDcode = 21; }     // Проверка SD-карты
            if (str == "ID22") { IDcode = 22; }     // Проверка Ethernet
            if (str == "ID23") { IDcode = 23; }     // Проверка CAN
            if (str == "ID24") { IDcode = 24; }     // Тест на I2C
     for( int i = 0; i < sizeof(my_str);  ++i )    // сброс строки рисвута // сброс полученной строки
          my_str[i] = (char)0;
        }
        else {my_str[pos++] = c;}
  }          
 }

Пожалуйста, помогите. Спасибо.......

, 👍1

Обсуждение

игнорируйте SerialEvent и поместите этот код в цикл(). это не что иное, как if (Serial.available()), вызываемый после функции цикла(), @Juraj

Соответствующий исходный код Arduino: https://github.com/arduino/ArduinoCore-avr/blob/b7c607663fecc232e598f2c0acf419ceb0b7078c/cores/arduino/HardwareSerial.cpp#L64-L85., @Gerben


1 ответ


1

Согласно https://www.arduino.cc/en/Reference/SerialEvent

Ардуино Мега обрабатывает:

void serialEvent1(){
//заявления
}

void serialEvent2(){
//заявления
}

void serialEvent3(){
//заявления
}

Каждый второй Arduino имеет только один:

void serialEvent(){
//statements
}
,