From cfd9d3c92d342fe253691523fa5dd3157ebdfc1a Mon Sep 17 00:00:00 2001 From: Lizongdi <1210855344@qq.com> Date: Mon, 22 Jun 2026 09:20:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E4=B8=BB=E7=BA=BF=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- library/common/CMakeLists.txt | 1 + library/common/common.c | 5 +- library/common/include/common.h | 16 +-- library/common/rd_mempool.c | 3 +- library/common/rd_thread.c | 7 +- library/common/rd_time.c | 3 +- library/list/CMakeLists.txt | 9 +- library/log/CMakeLists.txt | 5 +- library/ringbuffer/CMakeLists.txt | 5 +- library/ringbuffer/include/ringbuffer.h | 8 +- library/ringbuffer/ringbuffer.c | 18 ++-- peripheral/CMakeLists.txt | 17 ++-- peripheral/com.c | 129 +++++++++++++++--------- peripheral/include/com.h | 1 + 14 files changed, 133 insertions(+), 94 deletions(-) diff --git a/library/common/CMakeLists.txt b/library/common/CMakeLists.txt index 0ac2d5f..d05f73b 100644 --- a/library/common/CMakeLists.txt +++ b/library/common/CMakeLists.txt @@ -1,5 +1,6 @@ cmake_minimum_required(VERSION 3.10) +get_filename_component(TARGET_NAME "${CMAKE_CURRENT_SOURCE_DIR}" NAME) set(COMMON_CMAKE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt") if(EXISTS ${COMMON_CMAKE_PATH}) diff --git a/library/common/common.c b/library/common/common.c index 1caff30..22e9543 100644 --- a/library/common/common.c +++ b/library/common/common.c @@ -1,12 +1,9 @@ -#include #include -#include -#include #include #include #include "common.h" -WEAK void elog_output(uint8_t level, const char *tag, const char *file, const char *func, long line, const char *format, ...) +WEAK void elog_output(uint8_t level, const char *tag, const char *file, const char *func, long line, const char *format, ...) { RD_PRINTF("[%u/%s] [%s] (%s:%ld) %s\r\n", level, tag, func, file, line, format); } diff --git a/library/common/include/common.h b/library/common/include/common.h index 205e5f3..68593e9 100644 --- a/library/common/include/common.h +++ b/library/common/include/common.h @@ -12,9 +12,10 @@ #define RD_INVALUE -3 //非法参数 /* 跨平台弱符号宏定义 */ -#if defined(__GNUC__) || defined(__clang__) || defined(__SUNPRO_CC) || defined(__SUNPRO_C) - /* GCC, Clang, SunPro 系列 */ - #define WEAK __attribute__((weak)) +#if defined(_MSC_VER) || defined(WIN32) + /* Microsoft Visual C++ */ + /* 或者干脆定义为空,但需要确保不会重复定义 */ + #define WEAK #elif defined(__IAR_SYSTEMS_ICC__) /* IAR Embedded Workbench */ @@ -24,11 +25,10 @@ /* Keil MDK / ARM Compiler */ #define WEAK __weak -#elif defined(_MSC_VER) - /* Microsoft Visual C++ */ - /* 或者干脆定义为空,但需要确保不会重复定义 */ - #define WEAK - +#elif defined(__GNUC__) || defined(__clang__) || defined(__SUNPRO_CC) || defined(__SUNPRO_C) + /* GCC, Clang, SunPro 系列 */ + #define WEAK __attribute__((weak)) + #else /* 其他未知编译器,保守处理 */ #error "Weak symbol not supported on this compiler" diff --git a/library/common/rd_mempool.c b/library/common/rd_mempool.c index 10cde2a..50db0ee 100644 --- a/library/common/rd_mempool.c +++ b/library/common/rd_mempool.c @@ -182,7 +182,7 @@ static void merge_free_blocks(MemBlockHeader_t* block) prev_block = prev_block->next_free; } } - +#if !WIN32 WEAK void Rd_MemDoInit(void) { if (g_initialized) return; @@ -393,6 +393,7 @@ WEAK size_t Rd_MemPoolGetTotalCount(void) { return (size_t)MEM_POOL_TOTAL_SIZE; } +#endif void Rd_MemPoolInit_Auto(void) { diff --git a/library/common/rd_thread.c b/library/common/rd_thread.c index 8f4bc00..853aebc 100644 --- a/library/common/rd_thread.c +++ b/library/common/rd_thread.c @@ -44,6 +44,7 @@ /*----------------------------------------------* * 宏定义 * *----------------------------------------------*/ + WEAK int Rd_SemInit(void *_sem, int _iPshared, int _iValue) { return RD_FAILURE; @@ -84,17 +85,17 @@ WEAK int Rd_MutexDestroy(void *_pMutex) return RD_FAILURE; } -WEAK int Rd_ShmOpen(rd_shm_t *_ptShm, const char *_psName, int _iSize, int _iIsCreator, rd_shm_mode_t _eMode) +WEAK int Rd_ShmOpen(rd_shm_t *_ptShm, const char *_psName, int _iSize, int _iIsCreator, rd_shm_mode_t _eMode) { return RD_FAILURE; } -WEAK int Rd_ShmClose(rd_shm_t *_ptShm) +WEAK int Rd_ShmClose(rd_shm_t *_ptShm) { return RD_SUCCESS; } -WEAK int Rd_ShmUnlink(rd_shm_t *_ptShm) +WEAK int Rd_ShmUnlink(rd_shm_t *_ptShm) { return RD_SUCCESS; } diff --git a/library/common/rd_time.c b/library/common/rd_time.c index 0962bab..200e25a 100644 --- a/library/common/rd_time.c +++ b/library/common/rd_time.c @@ -46,7 +46,7 @@ WEAK unsigned int g_uiRandSeed = 12345; /*----------------------------------------------* * 宏定义 * *----------------------------------------------*/ - +#if !WIN32 && !defined(__ANDROID__) WEAK time_t rd_time(time_t *tloc) { if (tloc != NULL) @@ -89,3 +89,4 @@ WEAK void Rd_Delay(uint32_t Delay) void HAL_Delay(uint32_t Delay); HAL_Delay(Delay); } +#endif \ No newline at end of file diff --git a/library/list/CMakeLists.txt b/library/list/CMakeLists.txt index 52706cf..08c9d20 100644 --- a/library/list/CMakeLists.txt +++ b/library/list/CMakeLists.txt @@ -1,5 +1,6 @@ cmake_minimum_required(VERSION 3.10) +get_filename_component(TARGET_NAME "${CMAKE_CURRENT_SOURCE_DIR}" NAME) set(COMMON_CMAKE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt") if(EXISTS ${COMMON_CMAKE_PATH}) @@ -9,13 +10,13 @@ else() endif() if(TARGET common) - target_link_libraries(list INTERFACE common) + target_link_libraries(${TARGET_NAME} INTERFACE common) else() - message(WARNING "[list] Dependency 'common' not found.") + message(FATAL_ERROR "[${TARGET_NAME}] Dependency 'common' not found.") endif() if(TARGET log) - target_link_libraries(list INTERFACE log) + target_link_libraries(${TARGET_NAME} INTERFACE log) else() - message(WARNING "[list] Dependency 'log' not found.") + message(WARNING "[${TARGET_NAME}] Dependency 'log' not found.") endif() \ No newline at end of file diff --git a/library/log/CMakeLists.txt b/library/log/CMakeLists.txt index f32330e..9cd1a39 100644 --- a/library/log/CMakeLists.txt +++ b/library/log/CMakeLists.txt @@ -1,5 +1,6 @@ cmake_minimum_required(VERSION 3.10) +get_filename_component(TARGET_NAME "${CMAKE_CURRENT_SOURCE_DIR}" NAME) set(COMMON_CMAKE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt") if(EXISTS ${COMMON_CMAKE_PATH}) @@ -9,7 +10,7 @@ else() endif() if(TARGET common) - target_link_libraries(log PUBLIC common) + target_link_libraries(${TARGET_NAME} PUBLIC common) else() - message(WARNING "[log] Dependency 'common' not found.") + message(FATAL_ERROR "[${TARGET_NAME}] Dependency 'common' not found.") endif() \ No newline at end of file diff --git a/library/ringbuffer/CMakeLists.txt b/library/ringbuffer/CMakeLists.txt index 1b8bcaa..9cd1a39 100644 --- a/library/ringbuffer/CMakeLists.txt +++ b/library/ringbuffer/CMakeLists.txt @@ -1,5 +1,6 @@ cmake_minimum_required(VERSION 3.10) +get_filename_component(TARGET_NAME "${CMAKE_CURRENT_SOURCE_DIR}" NAME) set(COMMON_CMAKE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt") if(EXISTS ${COMMON_CMAKE_PATH}) @@ -9,7 +10,7 @@ else() endif() if(TARGET common) - target_link_libraries(ringbuffer PUBLIC common) + target_link_libraries(${TARGET_NAME} PUBLIC common) else() - message(WARNING "[ringbuffer] Dependency 'common' not found.") + message(FATAL_ERROR "[${TARGET_NAME}] Dependency 'common' not found.") endif() \ No newline at end of file diff --git a/library/ringbuffer/include/ringbuffer.h b/library/ringbuffer/include/ringbuffer.h index dccc884..0a753a3 100644 --- a/library/ringbuffer/include/ringbuffer.h +++ b/library/ringbuffer/include/ringbuffer.h @@ -70,10 +70,10 @@ typedef struct TRingBuffer rd_ringbuf_t; struct TRingBuffer { - unsigned short m_bReadMirror : 1; - unsigned short m_sReadIndex : 15; - unsigned short m_bWriteMirror : 1; - unsigned short m_sWriteIndex : 15; + unsigned char m_bReadMirror; + unsigned short m_sReadIndex; + unsigned char m_bWriteMirror; + unsigned short m_sWriteIndex; int m_iBufsize; char *m_pcBufPtr; }; diff --git a/library/ringbuffer/ringbuffer.c b/library/ringbuffer/ringbuffer.c index 133acc8..f97b5b1 100644 --- a/library/ringbuffer/ringbuffer.c +++ b/library/ringbuffer/ringbuffer.c @@ -126,7 +126,7 @@ int rd_RingbufferPut(rd_ringbuf_t *rb, const char *ptr, int length) length - (rb->m_iBufsize - rb->m_sWriteIndex)); /* we are going into the other side of the mirror */ - rb->m_bWriteMirror = ~rb->m_bWriteMirror; + rb->m_bWriteMirror ^= 1; rb->m_sWriteIndex = length - (rb->m_iBufsize - rb->m_sWriteIndex); return length; @@ -180,13 +180,13 @@ int rd_RingbufferPutForce(rd_ringbuf_t *rb, const char *ptr, int length) length - (rb->m_iBufsize - rb->m_sWriteIndex)); /* we are going into the other side of the mirror */ - rb->m_bWriteMirror = ~rb->m_bWriteMirror; + rb->m_bWriteMirror ^= 1; rb->m_sWriteIndex = length - (rb->m_iBufsize - rb->m_sWriteIndex); if (length > space_length) { if (rb->m_sWriteIndex <= rb->m_sReadIndex) - rb->m_bReadMirror = ~rb->m_bReadMirror; + rb->m_bReadMirror ^= 1; rb->m_sReadIndex = rb->m_sWriteIndex; } @@ -244,7 +244,7 @@ int rd_RingbufferGet(rd_ringbuf_t *rb, char *ptr, int length) length - (rb->m_iBufsize - rb->m_sReadIndex)); /* we are going into the other side of the mirror */ - rb->m_bReadMirror = ~rb->m_bReadMirror; + rb->m_bReadMirror ^= 1; rb->m_sReadIndex = length - (rb->m_iBufsize - rb->m_sReadIndex); return length; @@ -290,7 +290,7 @@ int rd_RingbufferPeak(rd_ringbuf_t *rb, char **ptr) size = rb->m_iBufsize - rb->m_sReadIndex; /* we are going into the other side of the mirror */ - //rb->m_bReadMirror = ~rb->m_bReadMirror; + //rb->m_bReadMirror ^= 1; //rb->m_sReadIndex = 0; return size; @@ -322,7 +322,7 @@ int rd_RingbufferPutchar(rd_ringbuf_t *rb, const char ch) /* flip mirror */ if (rb->m_sWriteIndex == rb->m_iBufsize-1) { - rb->m_bWriteMirror = ~rb->m_bWriteMirror; + rb->m_bWriteMirror ^= 1; rb->m_sWriteIndex = 0; } else @@ -357,11 +357,11 @@ int rd_RingbufferPutcharForce(rd_ringbuf_t *rb, const char ch) /* flip mirror */ if (rb->m_sWriteIndex == rb->m_iBufsize-1) { - rb->m_bWriteMirror = ~rb->m_bWriteMirror; + rb->m_bWriteMirror ^= 1; rb->m_sWriteIndex = 0; if (old_state == RINGBUFFER_FULL) { - rb->m_bReadMirror = ~rb->m_bReadMirror; + rb->m_bReadMirror ^= 1; rb->m_sReadIndex = rb->m_sWriteIndex; } } @@ -404,7 +404,7 @@ int rd_RingbufferGetchar(rd_ringbuf_t *rb, char *ch) if (rb->m_sReadIndex == rb->m_iBufsize-1) { - rb->m_bReadMirror = ~rb->m_bReadMirror; + rb->m_bReadMirror ^= 1; rb->m_sReadIndex = 0; } else diff --git a/peripheral/CMakeLists.txt b/peripheral/CMakeLists.txt index b0d2a81..afc9af4 100644 --- a/peripheral/CMakeLists.txt +++ b/peripheral/CMakeLists.txt @@ -1,5 +1,6 @@ cmake_minimum_required(VERSION 3.10) +get_filename_component(TARGET_NAME "${CMAKE_CURRENT_SOURCE_DIR}" NAME) set(COMMON_CMAKE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../library/CMakeLists.txt") if(EXISTS ${COMMON_CMAKE_PATH}) @@ -9,25 +10,25 @@ else() endif() if(TARGET list) - target_link_libraries(peripheral PUBLIC list) + target_link_libraries(${TARGET_NAME} PUBLIC list) else() - message(WARNING "[peripheral] Dependency 'list' not found.") + message(FATAL_ERROR "[${TARGET_NAME}] Dependency 'list' not found.") endif() if(TARGET platform_Linux) - target_link_libraries(peripheral PUBLIC platform_Linux) + target_link_libraries(${TARGET_NAME} PUBLIC platform_Linux) else() - message(WARNING "[peripheral] Dependency 'platform_Linux' not found.") + message(STATUS "[${TARGET_NAME}] Dependency 'platform_Linux' not found.") endif() if(TARGET log) - target_link_libraries(peripheral PUBLIC log) + target_link_libraries(${TARGET_NAME} PUBLIC log) else() - message(WARNING "[peripheral] Dependency 'log' not found.") + message(WARNING "[${TARGET_NAME}] Dependency 'log' not found.") endif() if(TARGET ringbuffer) - target_link_libraries(peripheral PUBLIC ringbuffer) + target_link_libraries(${TARGET_NAME} PUBLIC ringbuffer) else() - message(WARNING "[peripheral] Dependency 'ringbuffer' not found.") + message(FATAL_ERROR "[${TARGET_NAME}] Dependency 'ringbuffer' not found.") endif() \ No newline at end of file diff --git a/peripheral/com.c b/peripheral/com.c index e9ed1ad..4af530c 100644 --- a/peripheral/com.c +++ b/peripheral/com.c @@ -72,7 +72,8 @@ TComCtrl *rd_ComCreate(cbk_ComCheck _pfCheck, cbk_ComDecode _pfDecode, cbk_ComSe if (NULL == ptComCtrl) return NULL; ptComCtrl->m_iBufferSize = _iSize; ptComCtrl->m_pUserData = _pUserData; - //Rd_SemInit(&ptComCtrl->m_stComBuf.m_sem_Recv, 0, 0); + ptComCtrl->m_pSendTempBuffer = RD_CALLOC(1, _iSize); + Rd_SemInit(&ptComCtrl->m_stComBuf.m_sem_Recv, 0, 0); Rd_SemInit(&ptComCtrl->m_stComBuf.m_sem_Send, 0, 0); ptComCtrl->m_stComBuf.m_ptRecv = rd_RingbufferCreate(_iSize); rd_RingbufferReset(ptComCtrl->m_stComBuf.m_ptRecv); @@ -117,7 +118,8 @@ int rd_ComDelete(TComCtrl *_ptComCtrl) utarray_free(_ptComCtrl->m_pMutiDevArray); } - //Rd_SemDestroy(&_ptComCtrl->m_stComBuf.m_sem_Recv); + RD_FREE(_ptComCtrl->m_pSendTempBuffer); + Rd_SemDestroy(&_ptComCtrl->m_stComBuf.m_sem_Recv); Rd_SemDestroy(&_ptComCtrl->m_stComBuf.m_sem_Send); rd_RingbufferDestroy(_ptComCtrl->m_stComBuf.m_ptRecv); rd_RingbufferDestroy(_ptComCtrl->m_stComBuf.m_ptSend); @@ -167,22 +169,20 @@ int rd_ComSend(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize) void rd_ComSendProc(TComCtrl *_ptComCtrl) { if (NULL == _ptComCtrl) return; - char *pcBuffer = RD_CALLOC(1, _ptComCtrl->m_iBufferSize);; int iRet = 0; Rd_SemWait(&_ptComCtrl->m_stComBuf.m_sem_Send, __func__, NULL); - iRet = rd_RingbufferGet(_ptComCtrl->m_stComBuf.m_ptSend, pcBuffer, _ptComCtrl->m_iBufferSize); + iRet = rd_RingbufferGet(_ptComCtrl->m_stComBuf.m_ptSend, _ptComCtrl->m_pSendTempBuffer, _ptComCtrl->m_iBufferSize); if (iRet > 0) { - rd_ComSend(_ptComCtrl, pcBuffer, iRet); + rd_ComSend(_ptComCtrl, _ptComCtrl->m_pSendTempBuffer, iRet); } - RD_FREE(pcBuffer); } void rd_ComRecvProc(TComCtrl *_ptComCtrl, const char *_pBuffer, uint32_t _iSize) { if (NULL == _ptComCtrl) return; - int iRet = rd_RingbufferPutForce(_ptComCtrl->m_stComBuf.m_ptRecv, _pBuffer, _iSize); + int iRet = rd_RingbufferPut(_ptComCtrl->m_stComBuf.m_ptRecv, _pBuffer, _iSize); if (iRet > 0) { Rd_SemPost(&_ptComCtrl->m_stComBuf.m_sem_Recv, __func__, NULL); @@ -192,7 +192,7 @@ void rd_ComRecvProc(TComCtrl *_ptComCtrl, const char *_pBuffer, uint32_t _iSize) int rd_ComWrite(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize) { if (NULL == _ptComCtrl) return RD_INVALUE; - int iRet = rd_RingbufferPutForce(_ptComCtrl->m_stComBuf.m_ptSend, _pBuffer, _iSize); + int iRet = rd_RingbufferPut(_ptComCtrl->m_stComBuf.m_ptSend, _pBuffer, _iSize); if (iRet > 0) { Rd_SemPost(&_ptComCtrl->m_stComBuf.m_sem_Send, __func__, NULL); @@ -200,25 +200,6 @@ int rd_ComWrite(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize) return iRet; } -//static int rd_MutiDevIsconflict(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize, int _MyIdx) -//{ -// int iArrlen = utarray_len(_ptComCtrl->m_pMutiDevArray); -// for(int i = 0; i < iArrlen; i++) -// { -// TMutiDev **ppMutiDev = (TMutiDev**)utarray_eltptr(_ptComCtrl->m_pMutiDevArray, i); -// TMutiDev *ptMutiDev = *ppMutiDev; -// if (i == _MyIdx) continue; -// -// int result = ptMutiDev->m_pfCheck(_pBuffer, _iSize); -// if (result > 0) -// { -// return i; -// } -// } -// return RD_NULL; -//} - - /***************************************************************************** 函 数 名 : rd_ComRead 功能描述 : 读取一包数据,这里的入参用于存放校验通过的数据,如果buffer实际大小 @@ -245,9 +226,6 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize) return RD_INVALUE; } - uint32_t u32CurrentTime = Rd_GetTime(); - - Rd_SemWait(&_ptComCtrl->m_stComBuf.m_sem_Recv, __func__, NULL); char *pPeakData = NULL; int iPeakLen = rd_RingbufferPeak(_ptComCtrl->m_stComBuf.m_ptRecv, &pPeakData); @@ -258,11 +236,25 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize) } else if (0 == iPeakLen) { - return 0; + Rd_SemWait(&_ptComCtrl->m_stComBuf.m_sem_Recv, __func__, NULL); + iPeakLen = rd_RingbufferPeak(_ptComCtrl->m_stComBuf.m_ptRecv, &pPeakData); + + if (iPeakLen < 0) + { + return RD_FAILURE; + } + else if (0 == iPeakLen) + { + return 0; + } } + + uint32_t u32CurrentTime = Rd_GetTime(); + int iPackLen = 1; int iArrlen = utarray_len(_ptComCtrl->m_pMutiDevArray); + int bChecked = 0; if (_ptComCtrl->m_iDevIndex < 0) { @@ -274,16 +266,18 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize) TMutiDev **ppMutiDev = (TMutiDev**)utarray_eltptr(_ptComCtrl->m_pMutiDevArray, i); TMutiDev *ptMutiDev = *ppMutiDev; + iPackLen = 1; if (NULL != ptMutiDev->m_pfCheck) { iPackLen = ptMutiDev->m_pfCheck(pPeakData, iPeakLen); } - if (iPackLen > 0 && iPackLen <= iPeakLen) + if (iPackLen > 0) { _ptComCtrl->m_iDevIndex = i; bFound = 1; bDataValid = 1; + bChecked = 1; break; // 找到了就退出循环,去下面处理 } else if(0 == iPackLen) @@ -302,6 +296,8 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize) ptMutiDev->m_uiLastRecvTime = 0; bDataValid = 0; + + return RD_FAILURE; } else { @@ -340,31 +336,49 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize) TMutiDev **ppMutiDev = (TMutiDev**)utarray_eltptr(_ptComCtrl->m_pMutiDevArray, _ptComCtrl->m_iDevIndex); TMutiDev *ptMutiDev = *ppMutiDev; - if (NULL != ptMutiDev->m_pfCheck) + if (!bChecked) { - iPackLen = ptMutiDev->m_pfCheck(pPeakData, iPeakLen); + iPackLen = 1; + if (NULL != ptMutiDev->m_pfCheck) + { + iPackLen = ptMutiDev->m_pfCheck(pPeakData, iPeakLen); + } } - -// if (rd_MutiDevIsconflict(_ptComCtrl, pPeakData, iPeakLen, _ptComCtrl->m_iDevIndex) >= 0) -// { -// _ptComCtrl->m_iDevIndex = -1; -// char temp[1]; -// rd_RingbufferGet(_ptComCtrl->m_stComBuf.m_ptRecv, temp, 1); -// return RD_FAILURE; -// } if (iPackLen > 0 && iPackLen <= iPeakLen) { - int iLen = (_iSize > iPackLen) ? iPackLen : _iSize; - int iRet = rd_RingbufferGet(_ptComCtrl->m_stComBuf.m_ptRecv, _pBuffer, iLen); + if (_iSize < (uint32_t)iPackLen) + { + int remain = iPackLen; + char dropBuf[16]; + + while (remain > 0) + { + int once = (remain > (int)sizeof(dropBuf)) ? (int)sizeof(dropBuf) : remain; + int ret = rd_RingbufferGet(_ptComCtrl->m_stComBuf.m_ptRecv, dropBuf, once); + + if (ret <= 0) + { + break; + } + + remain -= ret; + } + + _ptComCtrl->m_iDevIndex = -1; + ptMutiDev->m_uiLastRecvTime = 0; + return RD_INVALUE; + } + int iRet = rd_RingbufferGet(_ptComCtrl->m_stComBuf.m_ptRecv, _pBuffer, iPackLen); if (iRet > 0) { - _ptComCtrl->m_iDevIndex = -1; - if(NULL != ptMutiDev->m_pfDecode) + _ptComCtrl->m_iDevIndex = -1; + ptMutiDev->m_uiLastRecvTime = 0; + + if (NULL != ptMutiDev->m_pfDecode) { - ptMutiDev->m_uiLastRecvTime = 0; - ptMutiDev->m_pfDecode(_pBuffer, iLen); + ptMutiDev->m_pfDecode(_pBuffer, iRet); } return iRet; } @@ -374,11 +388,30 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize) return RD_FAILURE; } } + else if (iPackLen == 0 || iPackLen > iPeakLen) + { + if (ptMutiDev->m_uiLastRecvTime == 0) + { + ptMutiDev->m_uiLastRecvTime = u32CurrentTime; + } + + if ((u32CurrentTime - ptMutiDev->m_uiLastRecvTime) > RECV_TIMEOUT) + { + char temp[1]; + rd_RingbufferGet(_ptComCtrl->m_stComBuf.m_ptRecv, temp, 1); + ptMutiDev->m_uiLastRecvTime = 0; + _ptComCtrl->m_iDevIndex = -1; + return RD_FAILURE; + } + + return 0; + } else { // 长度错误或异常 char temp[1]; rd_RingbufferGet(_ptComCtrl->m_stComBuf.m_ptRecv, temp, 1); + ptMutiDev->m_uiLastRecvTime = 0; _ptComCtrl->m_iDevIndex = -1; return RD_FAILURE; } diff --git a/peripheral/include/com.h b/peripheral/include/com.h index bd1b230..a28064d 100644 --- a/peripheral/include/com.h +++ b/peripheral/include/com.h @@ -95,6 +95,7 @@ typedef struct typedef struct { TComBuffer m_stComBuf; + char *m_pSendTempBuffer; int m_iBufferSize; int m_iDevIndex; // 表示当前正在接收的设备索引,-1表示当前无设备在处理 UT_array *m_pMutiDevArray;