导致ESP32随机停止并触发看门狗定时器重启的串行数据包

时间:2019-02-07 20:26:27

标签: c++ arduino esp32

我正在使用ESP32-Arduino在RTOS任务中连续接收串行数据(Serial1上为2400波特)。该任务使用状态机测试特定字节序列,并在设置有效的数据包标志之前进行数据包验证。

有时,当我收到太多数据时,系统将停止运行并触发看门狗重启。

我没有调试器,所以我只能依靠检查串行监视器(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 :(得分:0)

  

我以为缓冲区可能已满,我还不够   服务时间到了,但我不确定。

那么,当输入缓冲区(几乎)已满时会发生什么?是否有协议通知远程发送器不发送信号?如果不是这样,缓冲区可能会溢出,然后消息框架可能会混乱,这可能会使代码的逻辑混乱。

没有调试器:至少,请检查代码本身是否存在缓冲区溢出,并使其知道。如果有的话,代码还是没用。

  

我试图减少RTOS任务中的代码,让帖子   处理在主循环中完成。我想我可以完成任务了   甚至更多,但我没有进一步尝试。

完成该任务。通常,在RTOS内执行尽可能少的操作。

  

我也尝试增加或减少任务的频率   似乎没有什么作用。

这不会影响数据到达的速度。首先,要确定是否存在缓冲区溢出。