This commit is contained in:
Dominocs 2025-05-30 19:00:16 +08:00
parent 3fef64e421
commit b19bac0ee9
5 changed files with 17487 additions and 17471 deletions

File diff suppressed because one or more lines are too long

View File

@ -89,46 +89,64 @@ void serialClass::runFrame(unsigned long currentT){
return; return;
} }
/* serial timeout */ /* 检查超时 - 如果超过1秒没有新数据重置缓冲区 */
if((currentT - timer) > 1000){ if((currentT - timer) > 1000){
usSerialRxDataLen = 0; usSerialRxDataLen = 0;
usSerialRxDataOffset = 0; usSerialRxDataOffset = 0;
bRcvSerialHdr = false; bRcvSerialHdr = false;
} }
timer = currentT; timer = currentT;
usSerialRxDataLen += Serial.read(acSerialRxBuffer + usSerialRxDataLen, SERIAL_RX_BUFF_SIZE - usSerialRxDataLen);
/* 读取可用数据到缓冲区 */
int availableBytes = Serial.available();
int readBytes = Serial.readBytes(acSerialRxBuffer + usSerialRxDataLen,
min(availableBytes, SERIAL_RX_BUFF_SIZE - usSerialRxDataLen));
usSerialRxDataLen += readBytes;
/* 处理接收到的数据 */
while(usSerialRxDataLen >= SERIAL_MIN_SIZE){ while(usSerialRxDataLen >= SERIAL_MIN_SIZE){
if(!bRcvSerialHdr){ if(!bRcvSerialHdr){
bRcvSerialHdr = getSerialMsgHead(); bRcvSerialHdr = getSerialMsgHead();
if(!bRcvSerialHdr){ if(!bRcvSerialHdr){
usSerialRxDataOffset++; usSerialRxDataOffset++;
usSerialRxDataLen--; usSerialRxDataLen--;
/* 如果偏移量过大,移动数据到缓冲区开头 */
if(usSerialRxDataOffset > SERIAL_RX_BUFF_SIZE/2 && usSerialRxDataLen > 0){
memmove(acSerialRxBuffer, acSerialRxBuffer + usSerialRxDataOffset, usSerialRxDataLen);
usSerialRxDataOffset = 0;
}
continue; continue;
} }
} }
if(bRcvSerialHdr){ if(bRcvSerialHdr){
STREAM_TLV_S *pTmp = (STREAM_TLV_S *)(void *)(acSerialRxBuffer + usSerialRxDataOffset); STREAM_TLV_S *pTmp = (STREAM_TLV_S *)(acSerialRxBuffer + usSerialRxDataOffset);
int len = pTmp->uiLength + sizeof(STREAM_TLV_S); int len = pTmp->uiLength + sizeof(STREAM_TLV_S);
bRcvSerialHdr = false;
/* 长度异常 */ /* 长度异常 */
if(len > SERIAL_RX_BUFF_SIZE){ if(len > SERIAL_RX_BUFF_SIZE){
usSerialRxDataOffset += sizeof(uint8_t) * 4; bRcvSerialHdr = false;
usSerialRxDataLen -= sizeof(uint8_t) * 4; /* 向后偏移头标识符 */ usSerialRxDataOffset += sizeof(uint32_t); // 只跳过前缀字段
usSerialRxDataLen -= sizeof(uint32_t);
continue; continue;
} }
/* 正常解析 */ /* 数据不完整,等待更多数据 */
else if(usSerialRxDataLen >= len){ else if(usSerialRxDataLen < len){
serialMsgCallback(pTmp->uiType, pTmp->uiLength + sizeof(STREAM_TLV_S));
usSerialRxDataLen -= len;
usSerialRxDataOffset += len;
}else{
break; break;
} }
/* 正常解析 */
else {
serialMsgCallback(pTmp->uiType, len);
usSerialRxDataLen -= len;
usSerialRxDataOffset += len;
bRcvSerialHdr = false;
} }
} }
/* 复制到头部 */ }
if(usSerialRxDataLen > 0){
memcpy(acSerialRxBuffer, acSerialRxBuffer + usSerialRxDataOffset, usSerialRxDataLen); /* 如果有剩余数据,移动到缓冲区开头 */
if(usSerialRxDataLen > 0 && usSerialRxDataOffset > 0){
memmove(acSerialRxBuffer, acSerialRxBuffer + usSerialRxDataOffset, usSerialRxDataLen);
usSerialRxDataOffset = 0; usSerialRxDataOffset = 0;
} }
} }