我使用的是ESP32-的Arduino在RTOS的任务会持续接收串行数据(2400波特在接口Serial1)。使用状态机和一定的字节序列任务测试确实的数据包验证设置一个有效的数据包前旗。
偶尔,当我有太多的数据进来时,系统将停止,并触发看门狗重启。
我没有对我有调试器,所以我只能靠检查串口监视器(串行),并把打印报表。
我想也许缓冲区是满的,我没有得到足够的时间来服务,但我不知道。
我试图减少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);
}
}
不为什么有一些根本性的误解我对这个任务。
我想也许缓冲区是满的,我没有得到足够的时间来服务,但我不知道。
当输入缓冲器(几乎)完全会发生什么?是否有一个协议来用信号通知远程发射机不发送?如果不是,缓冲溢出可能,然后消息框可以搞的一团糟,这可以迷惑你的代码的逻辑。
没有调试:起码,检查代码本身内缓冲区溢出,并让他们知道。如果有,该代码是没用的反正。
我试图减少RTOS任务的代码,让后处理在主回路来完成。我想我可以更跳闸的任务,但我还没有尝试进一步。
完成该任务。作为一般规则,做尽可能少的RTOS内。
我也试着既增加或减少任务的频率,似乎不有所作为。
这不会影响数据的到达率。首先:确定是否存在缓冲区溢出。