2016-04-13 1 views
0

Я работаю над очень важным школьным проектом, который является MP3-плеером с веб-интерфейсом и веб-сервером с использованием мега-ардуинов. , когда я хочу использовать любую функцию ethernet lib, я должен приостановить музыку, потому что экран ethernet и экран mp3-плеера используют одну и ту же шину spi. Но когда я меняю громкость, это вызывает замораживание музыки в 1 секунду. чтобы избежать того, что я создал новые функции, которые приостанавливают музыку, вызовите функцию ethernet lib и резюме.Arduino сбой и перезагрузка в «случайных точках»

bool clientAvailable(EthernetClient &client){ 
    MP3player.pauseDataStream(); 
    bool a = client.connected(); 
    MP3player.resumeDataStream(); 
    return a; 
} 
int clientConnected(EthernetClient &client){ 
    MP3player.pauseDataStream(); 
    int a = client.available(); 
    MP3player.resumeDataStream(); 
    return a; 
} 
void stopClient(EthernetClient &client){ 
    MP3player.pauseDataStream(); 
    client.stop(); 
    MP3player.resumeDataStream(); 
} 

void checkForClient(int loading){ 
    String firstLine; 
    MP3player.pauseDataStream(); 
    EthernetClient client = server.available(); 
    MP3player.resumeDataStream(); 
    if (client) { 
    if(!loading){ 
     Serial.println(F("new client")); // CRASH HERE 
     bool endLn(false); 
     char chr; 
     int i(0); 
     while (clientConnected(client)) { 
     char received[clientAvailable(client)+2]; 
     while (clientAvailable(client)) { 
      MP3player.pauseDataStream(); 
      char c = client.read(); 
      MP3player.resumeDataStream(); 
      received[i] = c; 
      Serial.print(c); // OR HERE 
      if(!endLn){ 
      firstLine += c; 
      if (c == '\n'){ 
      endLn = true; 
      } 
      } 
      ++i; 
     } 
     received[i+1] = '\0'; 
     i = 0; 
     if(endLn){ 
      Serial.println(); 
      endLn = false; 
      Serial.print(F("first line : ")); 
      Serial.println(firstLine); 
     } 

что я получаю на выходе:

new û192.168.0.123 

есть IP в конце, потому что это где Arduino перезагрузка, и это первая вещь, которую я показываю. Если я удалю строку client.println (F («новый клиент»), ошибка будет происходить на линии client.print (c) (после отображения 3 или 4 символа). Если я удалю этот, будет врезаться куда-нибудь, но я не знаю, где.

Я проверил память, я как 600 байт, оставшихся в этой точке программы.

Любые идеи?

Спасибо.

+0

Как настроен ваш сторожевой таймер? Это отключено? Если нет, то где код, обслуживающий сторожевой таймер? – Lundin

+0

Я не знаю о коде, но просто чтение текста вопроса наполняет меня глубоким чувством беспокойства и предчувствия ... Похоже, вы посещаете пациента с множественной травмой и спрашиваете, как применять бандажную помощь :(Надеюсь, я ошибаюсь, но я думаю, что ваш дизайн истекает кровью. –

+0

@ Lundin это было не так, я пытался отключить его, но ничего не изменилось, если бы я включил его и настроил вместо него? – RedSkidy

ответ

0

Вероятно, вы имеете низкое состояние ОЗУ.

Кроме того, лет u не следует использовать класс String для firstLine. Это вызывает множество проблем, некоторые из которых могут возникать в произвольные моменты времени.

Просто используйте массив символов, как вы сделали для received. Храните каждый символ в массиве, пока не достигнет символ новой строки, и приращение длины для каждого символа:

void checkForClient(int loading){ 
    char firstLine[60]; 
    uint8_t firstLineLen = 0; 

    MP3player.pauseDataStream(); 
    EthernetClient client = server.available(); 
    MP3player.resumeDataStream(); 
    if (client) { 
    if(!loading){ 
     Serial.println(F("new client")); // CRASH HERE 
     bool endLn(false); 
     char chr; 
     int i(0); 
     while (clientConnected(client)) { 
     char received[clientAvailable(client)+2]; 
     while (clientAvailable(client)) { 
      MP3player.pauseDataStream(); 
      char c = client.read(); 
      MP3player.resumeDataStream(); 
      received[i] = c; 
      Serial.print(c); // OR HERE 
      if (!endLn) { 
      if (firstLineLength < sizeof(firstLine)-2) 
       firstLine[ firstLineLength++ ] = c; 
      if (c == '\n') { 
       endLn = true; 
       firstLine[ firstLineLength ] = '\0'; // NUL-terminate 
      } 
      } 
      ++i; 
     } 
     received[i+1] = '\0'; 
     i = 0; 
     if(endLn){ 
      Serial.println(); 
      endLn = false; 
      Serial.print(F("first line : ")); 
      Serial.println(firstLine); 
     } 

Это также сэкономит около 1600 байт памяти программ. Есть много причин, чтобы избежать String, и многие люди писали о подводных камнях. Если вы используете String в другом месте вашей программы, вы должны использовать аналогичный подход для его устранения.

Другой способ уменьшения ОЗУ состоит в том, чтобы избежать хранения данных, когда он входит, а затем использовать его позже. Вместо этого, используйте его сразу:

void checkForClient(int loading){ 

    MP3player.pauseDataStream(); 
    EthernetClient client = server.available(); 
    MP3player.resumeDataStream(); 
    if (client) { 
    if(!loading){ 
     Serial.println(F("new client")); // CRASH HERE 

     Serial.print(F("first line : ")); 
     bool endLn(false); 

     char chr; 
     int i(0); 
     while (clientConnected(client)) { 
     char received[clientAvailable(client)+2]; 
     while (clientAvailable(client)) { 
      MP3player.pauseDataStream(); 
      char c = client.read(); 
      MP3player.resumeDataStream(); 
      received[i] = c; 
      if (!endLn) { 
      Serial.print(c); // printed now instead of saved for later 
      if (c == '\n') { 
       endLn = true; 
      } 
      } 
      ++i; 
     } 
     received[i+1] = '\0'; 
     i = 0; 
     if (endLn) { 
      Serial.println(); 
      endLn = false; 
      //Serial.println(firstLine); // NOT NEEDED, already printed! 
     } 

Это экономит всю оперативную память вы бы использовали для firstLine.

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

+0

спасибо за эти советы, но к сожалению, он не работал ... есть еще небольшое улучшение Тхо, это то, что я получаю: 'новый клиент GET/HTTP¯192.168.0.123' это только делает, что с Я добавил эти функции, но я не понимаю, почему. вот полный код: http://pastebin.com/BWFqVGEv – RedSkidy

+0

Я также изменю строки в моей структуре mp3 – RedSkidy

+0

@RedSkidy, я рад, что это лучше. BTW, вы можете отредактировать свой оригинальный вопрос и включить свой эскиз. Большинство людей не будут загружать что-то, чтобы ответить на вопрос ... кроме библиотек. Если вы используете библиотеку, разместите * ссылку * на тот, который вы используете, не включайте * его в свой пост. –

Смежные вопросы