Я хочу, чтобы мой arduino mega одновременно читал со всех 4 последовательных портов, последовательно проходя через каждый из них.

В настоящее время у меня есть код, работающий через Serial1, который работает именно так, как я хочу:

int RFIDResetPin = 13;


void setup()
{
  Serial.begin(9600);
  Serial1.begin(9600);
  Serial2.begin(9600);
  pinMode(RFIDResetPin, OUTPUT);
  digitalWrite(RFIDResetPin, HIGH);
  Serial.println("Arduino is ready");
}

void loop(){

  char tagString1[13];
  int index = 0;
  boolean reading1 = false;
  /////////////////////////////////////////
  // это читается из установленного считывателя
  // на serial1, который является контактом 19
  ////////////////////////////////////////
  while (Serial1.available() > 0) {

    int readByte1 = Serial1.read(); //читаем следующий доступный байт

    if (readByte1 == 2) reading1 = true;
    if (readByte1 == 3) reading1 = false;

    if (reading1 && readByte1 != 2 && readByte1 != 10 && readByte1 != 13) {
      tagString1[index] = readByte1;
      index++;
    }
  }
  Serial.print("Reader 1: "); //читаем любой неизвестный тег
  Serial.println(tagString1);


  clearTag(tagString1); //Очистить символ от всех значений
  resetReader(); //сбросить считыватель RFID
}




void resetReader() {
  ////////////////////////////////////
  // Сбросьте считыватель RFID для повторного чтения.
  ////////////////////////////////////
  digitalWrite(RFIDResetPin, LOW);
  digitalWrite(RFIDResetPin, HIGH);
  delay(150);
}

void clearTag(char one[]) {
  ////////////////////////////////////
  // очистить массив символов, заполнив его нулем — ASCII 0
  //В противном случае будет считаться, что тот же тег был прочитан
  ////////////////////////////////////
  for (int i = 0; i < strlen(one); i++) {
    one[i] = 0;
  }
}

Однако я также хочу добавить serial0, 2 и 3. у меня 2 основных вопроса 1) можно ли скопировать этот участок кода:

    while (Serial1.available() > 0) {

    int readByte1 = Serial1.read(); //читаем следующий доступный байт

    if (readByte1 == 2) reading1 = true;
    if (readByte1 == 3) reading1 = false;

    if (reading1 && readByte1 != 2 && readByte1 != 10 && readByte1 != 13) {
      tagString1[index] = readByte1;
      index++;
    }
  }
  Serial.print("Reader 1: "); //читаем любой неизвестный тег
  Serial.println(tagString1);


  clearTag(tagString1); //Очистить символ от всех значений
  resetReader(); //сбросить считыватель RFID
}

при изменении некоторых имен переменных для подключения других последовательных портов? Я видел кое-что здесь, но не знаю, как это реализовать, и будет ли это вообще работать для я.

и 2) поскольку я перенаправляю входящие данные через serial0, возможно ли, чтобы этот код работал и над ним?

, 👍1

Обсуждение

Есть ли что-то, что определяет конец данных? Например, перевод строки? Есть ли стартовый байт? Какие данные получены., @Jot

В вашем коде я не указал четыре последовательных порта. Я понимаю, что вы не загрузили полный код или просто создали четыре объекта для одного порта. Как сказал @jsotola, вы не можете читать все последовательные порты одновременно с помощью одного ALU или Ardunio, вам нужно четыре ALU или Arduino для одновременной обработки четырех периферийных устройств. Если вы собираетесь последовательное чтение, я советую вам сначала прочитать данные со всех портов, а затем перейти к анализу данных., @Vaibhav

Затем я помещал каждый входящий символ в буфер. Буфер на последовательный порт. Когда cr/lf получен, данные в буфере могут быть обработаны. Возможно, все буферы и все последовательные порты можно поместить в массив или массив структур., @Jot


1 ответ


3

Arduino уже считывает информацию с 4 последовательных портов одновременно. Или по крайней мере, как можно ближе к «одновременно» с одним процессором: каждый раз, когда байт поступает на один порт, срабатывает прерывание который считывает байт из UART и помещает его в буфер. Ты можешь затем получите его из буфера с помощью Serial.read().

Теперь вам нужно переместить байты из этих буферов (которые относятся к аппаратной последовательной библиотеке Arduino) в ваши собственные буферы для дальнейшая обработка. Вы можете сделать это, последовательно проверяя порты. и обрабатывать каждый по очереди. Все будет хорошо, пока ты там нет кода блокировки. Если вы блокируете, то запускаете риск переполнения одного из библиотечных буферов. Код, который вы разместили не блокирует, так что все в порядке.

возможна ли копипаста

Вам следует избегать программирования методом копирования и вставки. Дело не в том, что не будет работать (это будет), но вы создадите кошмар обслуживания. Вместо этого поместите код, который вы хотите скопировать и вставить, в функцию, и вызывать эту функцию столько раз, сколько требуется. Например:

void handlePort(Stream &port, const char *readerName, char *tagString)
{
    boolean reading1 = false;
    while (port.available() > 0) {
        int readByte1 = port.read(); //читаем следующий доступный байт

        if (readByte1 == 2) reading1 = true;
        if (readByte1 == 3) reading1 = false;
        if (reading1 && readByte1 != 2 && readByte1 != 10 && readByte1 != 13) {
            tagString[index] = readByte1;
            index++;
        }
    }
    Serial.print(readerName); //читаем любой неизвестный тег
    Serial.print(": ");
    Serial.println(tagString);

    clearTag(tagString); //Очистить символ от всех значений
    resetReader(); //сбросить считыватель RFID
    }
}

И вы вызываете это в loop():

handlePort(Serial1, "Reader 1", tagString1);
handlePort(Serial2, "Reader 2", tagString2);
...
,

@Rambunctiouslad: 1. Все, что вы хотите изменить с порта на порт, должно передаваться в качестве аргумента функции. В частности, о проблеме «Читатель 1»/«Читатель 2» см. код в моем исправленном ответе. 2. По поводу «tagString1 в цикле() выдает ошибку»: извините, у меня нет хрустального шара, который мог бы сказать мне, в чем заключается ошибка., @Edgar Bonet