Я использую 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);
}
}
не то, почему у меня есть какое-то фундаментальное недопонимание по поводу этой задачи.