Последовательные пакеты, вызывающие случайную остановку ESP32 и запуск перезагрузки сторожевого таймера - PullRequest
0 голосов
/ 07 февраля 2019

Я использую ESP32-Arduino для непрерывного получения последовательных данных (2400 бод на Serial1) в задаче RTOS.Задача проверяет определенную последовательность байтов с использованием конечного автомата и проверяет пакет перед установкой действительного флага пакета.

Иногда, когда поступает слишком много данных, система останавливается и запускает перезагрузку сторожевого таймера.

У меня нет отладчика, поэтому я могу рассчитывать только на проверку последовательного монитора (Serial) и установку операторов печати. ​​

Я подумал, что, возможно, буфер заполнен, и я не сделалУ меня недостаточно времени для обслуживания, но я не уверен.

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

Я также пытался увеличить или уменьшить частоту выполнения задачи, и, похоже, ничего не изменилось.

Вот мой код:


void readSerial(void *pvParameters)
{
    for (;;)
    {
        // Serial.print("chars avail: ");        
        while (Serial1.available())
        {
            char ch = Serial1.read();
            switch (nextSerialRecieveState)
            {
            case IDLE:
            case HEADER_0:
            default:
                rxByteIndex = 0;
                checkSum = 0;
                if (ch == 0x5A)
                {
                    nextSerialRecieveState = HEADER_1;
                }
                else
                {
                    nextSerialRecieveState = IDLE;
                }
                break;
            case HEADER_1:
                if (ch == 0x54)
                {
                    nextSerialRecieveState = PACKET_LENGTH;
                }
                else
                {
                    nextSerialRecieveState = IDLE;
                }
                break;
            case PACKET_LENGTH:



            case CHECKSUM_UPPER:
                checkSumUpperByte = ch;
                nextSerialRecieveState = CHECKSUM_LOWER;
                break;
            case CHECKSUM_LOWER:
                checkSumLowerByte = ch;
                if ((((checkSumUpperByte << 8) + checkSumLowerByte) == checkSum))
                {
                    serialPrintBuffer();
                    Serial.print("VALID PACKET FROM ");
                    Serial.print(SOURCE_BYTE_0, HEX);
                    Serial.print(":");
                    Serial.print(SOURCE_BYTE_1, HEX);
                    Serial.print(":");
                    Serial.println(SOURCE_BYTE_2, HEX);
                    validPacketFlag = 1;     


        }
                }
                nextSerialRecieveState = IDLE;
                break;
            }
            //lastByteReceivedTime = millis();
        }
        delay(10);
    }
}

не то, почему у меня есть какое-то фундаментальное недопонимание по поводу этой задачи.

1 Ответ

0 голосов
/ 07 февраля 2019

Я подумал, что, возможно, буфер заполнен, и у меня недостаточно времени для обслуживания, но я не уверен.

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

Нет отладчика: по крайней мере, проверьте переполнение буфера в самом коде исделать это известным.Если есть, то код в любом случае бесполезен.

Я попытался уменьшить код в задаче RTOS и позволить выполнить постобработку в основном цикле.Думаю, я мог бы еще больше справиться с этой задачей, но я не пробовал дальше.

Завершите эту задачу.Как правило, делайте как можно меньше в ОСРВ.

Я также пытался увеличить или уменьшить частоту выполнения задачи, и, похоже, ничего не изменилось.

Это не повлияет на скорость поступления данных.Перво-наперво: установите, не переполнен ли буфер.

...