我正在使用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);
}
}
不是为什么我对此任务有一些根本的误解。
答案 0 :(得分:0)
我以为缓冲区可能已满,我还不够 服务时间到了,但我不确定。
那么,当输入缓冲区(几乎)已满时会发生什么?是否有协议通知远程发送器不发送信号?如果不是这样,缓冲区可能会溢出,然后消息框架可能会混乱,这可能会使代码的逻辑混乱。
没有调试器:至少,请检查代码本身是否存在缓冲区溢出,并使其知道。如果有的话,代码还是没用。
我试图减少RTOS任务中的代码,让帖子 处理在主循环中完成。我想我可以完成任务了 甚至更多,但我没有进一步尝试。
完成该任务。通常,在RTOS内执行尽可能少的操作。
我也尝试增加或减少任务的频率 似乎没有什么作用。
这不会影响数据到达的速度。首先,要确定是否存在缓冲区溢出。