Пытаюсь послать .wav файлы между NodeMCU

Я пытаюсь отправить wav-файлы между двумя NodeMCU. Моя настройка похожа на этот модуль карты USD -> Arduino Mega ->> Node MCU >>

Итак, это моя установка, где у меня есть 4 таких устройства. Один из них будет служить центральной сетью(где я назвал его "сервером"), где он создаст точку доступа для подключения 3 других устройств("модулей"). Сервер будет отправлять данные с помощью UDP, чтобы они могли транслироваться на три модуля одновременно. Я могу отправлять файлы .txt, которые хранятся в модуле uSD. Передайте содержимое файла .txt в NodeMCU через последовательный порт, затем получите его на другом NodeMCU, который затем отправит данные в Arduino Mega также через последовательный порт и сохранит их на своем щите uSD.

Когда я попробую использовать файлы .wav. Он способен посылать целое .wav-файл в NodeMCU от Arduino Mega (так как файлы .wav слишком велики, я делю их на .wav файлы в наборы, так как последовательный порт не может обрабатывать слишком большие данные, отправляемые/получаемые. Но когда он отправляет данные из NodeMCU в другой NodeMCU, есть части, которые не отправляются. Когда я пытаюсь наблюдать за тем, что не отправляется, это часть формата заголовка WAV, поэтому он должен быть отправлен. Я буду публиковать коды, которые я использую для отправки и получения, а также скриншот/пример wav-файла по мере его отправки.

Сервер Arduino Mega отправляет данные в NodeMCU последовательно:

void sendFiletoSerial(char fileSend[12]){
  Serial.println();
  Serial1.println();
  if (!myFile.open(fileSend, O_READ)) {
    sdf.errorHalt("opening test.txt for read failed");
  }
  Serial.print(fileSend);
  Serial.print(" Size:");
  Serial.println(myFile.fileSize());

  Serial1.print(fileSend);
  Serial1.print(" Size:");
  Serial1.println(myFile.fileSize());
  delay(1500);
  fileofSize = myFile.fileSize();
  myFile.close();
  // read from the file until there's nothing else in it:
  char data;
  long int index=0;
    for(int i =0; i<(fileofSize/tempSize);i++){
    if (!myFile.open(fileSend, O_READ)) {
    sdf.errorHalt("opening test.txt for read failed");
  }
    //Serial.println(i);
    myFile.seekSet(index);
  for(int j =0; j<tempSize;j++){
  int temp = myFile.read();
 intTempFile[j]=temp;
  index++;

  }
  for(int k =0;k<tempSize;k++){
  Serial1.write(intTempFile[k]);
  }
    myFile.close();
    delay(1500);
  }
  Serial.println("LAST SET OF DATA");
    if (!myFile.open(fileSend, O_READ)) {
    sdf.errorHalt("opening test.txt for read failed");
  }
    myFile.seekSet(index);
    int lastSetSize=fileofSize-((fileofSize/tempSize)*tempSize);
    Serial.println(fileofSize-((fileofSize/tempSize)*tempSize));
  for(int j =0; j<lastSetSize;j++){
 int temp = myFile.read();

 intTempFile[j]=temp;
  index++;

  }
  Serial.println();
  Serial.println("tempFile");
  for(int k =0;k<lastSetSize;k++){
  Serial1.write(intTempFile[k]);
  }
    myFile.close();

}

Код сервера для отправки из NodeMCU в другой MCU узла:

    if (Serial.available()) {
          byte readStr[100];
        Serial.readBytes(readStr,100);
       // Serial.write(readStr[i]);
        }

         port.beginPacket("192.168.4.255",2390);
         for(int i =0; i <100; i++){
        port.write(readStr[i]);
         }
         port.endPacket();
      }

Код модуля для NodeMCU для получения данных от других NodeMCU:

void dumpMode(){
  while(1){
    int packetSize = port.parsePacket();
      if (packetSize) {
        port.read(packetBuffer, fileSentSize);
        Serial.write(packetBuffer);

  }
  if(Serial.available()){
    String reply = Serial.readString();
    if(reply == "STOP"){
      break;
    }

    }
  }
}

NodeMCU Сервера Отправил данные:

RIFFäN  WAVEfmt      À]  À]    dataÀN  €€€€€€€€€€€€€€€€€€€€€€€€

Модуль NodeMCU Получил Данные:

RIFFäN€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€

Есть ли что-то, что я делаю неправильно, поэтому NodeMCU не отправляет или не получает каждое содержимое файла wav?

Спасибо за тех, кто поможет. :)

, 👍-1


1 ответ


0

Вы могли бы просто запрограммировать NODEMCU и пропустить Megas; у них достаточно контактов для подключения SD-карты. В вашем коде так много неправильного: вы открываете и закрываете один и тот же файл так много раз, а затем вам приходится искать каждый фрагмент из-за предыдущей гадости, писать и читать байты по отдельности вместо того, чтобы просто передавать их в буфер, среди прочего. Я также надеюсь, что вы знаете, что отправляли в передающий узел не только данные WAV; до этого была куча вещей (CRLF, размер файла и т. Д.).

Ваша конкретная проблема, скорее всего, заключается в том, что ваш Мега - "сервер" просто непрерывно отправляет блоки в NodeMCU, не обращая внимания на то, читает ли последний их достаточно быстро, чтобы его последовательный буфер не переполнялся, особенно учитывая, что вы отправляете данные по сети между блоками. Вы также должны отметить, что UDP не совсем самый надежный протокол; у него нет подключения, и поэтому пакеты будут потеряны. Обычно он используется, если потеря пакетов не имеет большого значения (в вашем случае это так) или если верхние уровни реализуют контроль ошибок.

Что вам нужно реализовать, так это способ для каждой стороны подтвердить, что она получила следующий фрагмент, прежде чем отправитель передаст следующий. Серверу необходимо дождаться "доброго времени суток" от NodeMCU перед отправкой следующего блока; например, NodeMCU может ответить на каждый блок количеством фактически прочитанных байтов, чтобы вы могли знать, следует ли уменьшить размер блока, чтобы не перегружать буфер NodeMCU.

Пакеты, отправляемые по сети, также должны быть помечены порядковым номером (из-за вышеупомянутого контроля ошибок). NodeMCU получателя должен подтверждать пакет, который он получил, каждый пакет, возможно, отправляя номер этого пакета в передающий NodeMCU. Это поможет убедиться, что все пакеты получены и в порядке. Или вы могли бы просто использовать TCP, который уже реализует это и многое другое.

,

На самом деле у меня также есть RFID-сканер, подключенный к Mega, а также воспроизведение некоторых WAV-файлов с помощью arduino, вот почему мне все еще нужно использовать Mega + NodeMCU. "CRLF, размер файла и т. Д.", О котором вы упомянули, - это заголовок Wav объемом 44 байта, верно? Я также пытаюсь отправить это, но так как это та часть, которая не отправляется, она не может полностью создать wav-файл. Я выбрал UDP вместо TCP, так как мне нужно транслировать данные между 3 модулями. Основываясь на моих исследованиях, UDP может реализовывать широковещательную передачу, в то время как TCP может", но если я ошибаюсь, пожалуйста, сообщите мне., @boomacoh

@boomacoh Материал, о котором я упомянул, не является частью официального заголовка, если вы не имеете в виду свой собственный настроенный заголовок, помогающий анализировать данные. TCP не предназначен для широковещательной передачи, да, но если вы используете UDP, вам придется найти способ обработки потерянных пакетов., @SoreDakeNoKoto