mirror of
https://github.com/Dominocs/Project_Cymple.git
synced 2025-11-04 14:49:40 +08:00
bugfix
This commit is contained in:
parent
3fef64e421
commit
b19bac0ee9
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue
Block a user