From 2b68578a946d91386e7ff70c84a04b1bc8c3f608 Mon Sep 17 00:00:00 2001 From: Lizongdi <1210855344@qq.com> Date: Thu, 18 Jun 2026 13:38:30 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BC=98=E5=8C=96com=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- peripheral/com.c | 84 ++++++++++++++++++++++------------------ peripheral/include/com.h | 1 + 2 files changed, 48 insertions(+), 37 deletions(-) diff --git a/peripheral/com.c b/peripheral/com.c index e9ed1ad..aa6c5e6 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,16 +169,14 @@ 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) @@ -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实际大小 @@ -279,7 +260,7 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize) iPackLen = ptMutiDev->m_pfCheck(pPeakData, iPeakLen); } - if (iPackLen > 0 && iPackLen <= iPeakLen) + if (iPackLen > 0) { _ptComCtrl->m_iDevIndex = i; bFound = 1; @@ -344,19 +325,29 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize) { 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 < iPackLen) + { + // 用户 buffer 太小,直接丢弃完整包,避免污染后续解析 + char *dropBuf = RD_CALLOC(1, iPackLen); + if (dropBuf != NULL) + { + rd_RingbufferGet(_ptComCtrl->m_stComBuf.m_ptRecv, dropBuf, iPackLen); + RD_FREE(dropBuf); + } + else + { + char temp[1]; + rd_RingbufferGet(_ptComCtrl->m_stComBuf.m_ptRecv, temp, 1); + } + + _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) { @@ -364,7 +355,7 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize) if(NULL != ptMutiDev->m_pfDecode) { ptMutiDev->m_uiLastRecvTime = 0; - ptMutiDev->m_pfDecode(_pBuffer, iLen); + ptMutiDev->m_pfDecode(_pBuffer, iRet); } return iRet; } @@ -374,11 +365,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; From a76e019cf9ff47cce15986932a5ad4338682cc61 Mon Sep 17 00:00:00 2001 From: Lizongdi <1210855344@qq.com> Date: Thu, 18 Jun 2026 14:59:44 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E3=80=90=E4=B8=BB=E7=BA=BF=E5=BE=85?= =?UTF-8?q?=E5=90=88=E3=80=91=E8=A7=A3=E5=86=B3CAN=E5=B8=A7ID=E5=A4=84?= =?UTF-8?q?=E7=90=86=E6=9C=89=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C?= =?UTF-8?q?=E4=B9=8B=E5=89=8D=E6=B2=A1=E6=9A=B4=E9=9C=B2=E5=87=BA=E6=9D=A5?= =?UTF-8?q?=E6=98=AF=E5=9B=A0=E4=B8=BA=E4=B8=80=E7=9B=B4=E8=AF=95=E7=9A=84?= =?UTF-8?q?=E5=8D=95=E5=AD=97=E8=8A=82ID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bspMCU/bsp_CAN.c | 7 ++++--- bspMCU/include/bsp_CAN.h | 2 +- bspMCU/l_can.c | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/bspMCU/bsp_CAN.c b/bspMCU/bsp_CAN.c index 2c4e9ed..0f87c51 100644 --- a/bspMCU/bsp_CAN.c +++ b/bspMCU/bsp_CAN.c @@ -127,10 +127,11 @@ void CAN_RX_IRQHandler(TComCtrl *_ptComCtrl) } } -int CAN_TX_FIFOQ(TComCtrl *_ptComCtrl, uint32_t _iFrameID, char *_pBuffer, uint32_t _iSize) +int CAN_TX_FIFOQ(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize) { TCANUserData *ptCANUserData = (TCANUserData *)_ptComCtrl->m_pUserData; ptCANUserData->m_cantx->BitRateSwitch = FDCAN_BRS_OFF; + uint32_t iFrameID = (_pBuffer[0] & 0xFF) | ((_pBuffer[1] & 0xFF) << 8) | ((_pBuffer[2] & 0xFF) << 16) | ((_pBuffer[3] & 0xFF) << 24); #if CONFIG_CAN_NEW_VERSION ptCANUserData->m_cantx->DataLength = (uint32_t) _iSize; @@ -139,9 +140,9 @@ int CAN_TX_FIFOQ(TComCtrl *_ptComCtrl, uint32_t _iFrameID, char *_pBuffer, uint3 #endif ptCANUserData->m_cantx->FDFormat = FDCAN_CLASSIC_CAN; ptCANUserData->m_cantx->IdType = FDCAN_STANDARD_ID; - ptCANUserData->m_cantx->Identifier = _iFrameID; + ptCANUserData->m_cantx->Identifier = iFrameID; ptCANUserData->m_cantx->TxFrameType = FDCAN_DATA_FRAME; - HAL_FDCAN_AddMessageToTxFifoQ(ptCANUserData->m_can, ptCANUserData->m_cantx, (const uint8_t *)_pBuffer); + HAL_FDCAN_AddMessageToTxFifoQ(ptCANUserData->m_can, ptCANUserData->m_cantx, (const uint8_t *)&_pBuffer[4]); return ptCANUserData->m_cantx->DataLength; } diff --git a/bspMCU/include/bsp_CAN.h b/bspMCU/include/bsp_CAN.h index 57c8670..0ba8b17 100644 --- a/bspMCU/include/bsp_CAN.h +++ b/bspMCU/include/bsp_CAN.h @@ -97,7 +97,7 @@ typedef struct extern void CAN_IT_init(TComCtrl *_ptComCtrl); extern TCANUserData *CAN_userdata_init(FDCAN_HandleTypeDef *_fdCAN, uint32_t _Size, int _iIsLoop); extern void CAN_RX_IRQHandler(TComCtrl *_ptComCtrl); -extern int CAN_TX_FIFOQ(TComCtrl *_ptComCtrl, uint32_t _iFrameID, char *_pBuffer, uint32_t _iSize); +extern int CAN_TX_FIFOQ(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize); #endif diff --git a/bspMCU/l_can.c b/bspMCU/l_can.c index 89d251f..bb5b65c 100644 --- a/bspMCU/l_can.c +++ b/bspMCU/l_can.c @@ -15,7 +15,7 @@ TComCtrl *g_ptCAN1; int CAN1_Send(char *_pBuffer, uint32_t _iSize) { - return CAN_TX_FIFOQ(g_ptCAN1, _pBuffer[0], &_pBuffer[4], _iSize); + return CAN_TX_FIFOQ(g_ptCAN1, _pBuffer, _iSize); } void HAL_FDCAN_ErrorStatusCallback(FDCAN_HandleTypeDef *hfdcan, uint32_t ErrorStatusITs) From 0a1e3ef8a560192eae7ad51dc18f570c1bd5a424 Mon Sep 17 00:00:00 2001 From: Lizongdi <1210855344@qq.com> Date: Thu, 18 Jun 2026 15:01:44 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E9=85=8D=E5=90=88=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=B0=83=E7=94=A8=EF=BC=8C=E5=90=8C=E6=97=B6?= =?UTF-8?q?=E8=A7=A3=E5=86=B3CAN=E5=9B=9E=E5=8F=91=E6=97=B6=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C=E5=8E=9F=E5=9B=A0?= =?UTF-8?q?=E6=98=AFcheck=E4=BC=9A=E8=A7=A6=E5=8F=91=E4=B8=A4=E6=AC=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/RBcore/drv_interface.c | 4 ++-- project/Spoolend/Spoolend.c | 32 +++++++++++++++++++++++--------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/project/RBcore/drv_interface.c b/project/RBcore/drv_interface.c index 52c2b91..a8dafb8 100644 --- a/project/RBcore/drv_interface.c +++ b/project/RBcore/drv_interface.c @@ -118,12 +118,12 @@ int RS485_4_Send(char *_pBuffer, uint32_t _iSize) int FDCAN1_Send(char *_pBuffer, uint32_t _iSize) { - return CAN_TX_FIFOQ(g_ptFDCAN1, _pBuffer[0], &_pBuffer[4], _iSize); + return CAN_TX_FIFOQ(g_ptFDCAN1, _pBuffer, _iSize); } int FDCAN2_Send(char *_pBuffer, uint32_t _iSize) { - return CAN_TX_FIFOQ(g_ptFDCAN2, _pBuffer[0], &_pBuffer[4], _iSize); + return CAN_TX_FIFOQ(g_ptFDCAN2, _pBuffer, _iSize); } #ifndef CONFIG_UART_IT_IDLEDMA diff --git a/project/Spoolend/Spoolend.c b/project/Spoolend/Spoolend.c index c73524b..41d01db 100644 --- a/project/Spoolend/Spoolend.c +++ b/project/Spoolend/Spoolend.c @@ -18,6 +18,7 @@ ******************************************************************************/ #include "bsp_uart.h" #include "bsp_CAN.h" +#include "com.h" #include "fdcan.h" /*----------------------------------------------* * 外部变量说明 * @@ -84,27 +85,39 @@ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) static int check_RS485_1(char *_pBuffer, uint32_t _iSize) { - rd_ComSend(g_ptRS485_1, _pBuffer, _iSize); return _iSize; } static int check_RS485_2(char *_pBuffer, uint32_t _iSize) { - rd_ComSend(g_ptRS485_2, _pBuffer, _iSize); return _iSize; } static int check_Spoolend(char *_pBuffer, uint32_t _iSize) { - TCANUserData *ptCANUserData = (TCANUserData *)g_ptFDCAN1->m_pUserData; - uint32_t iCANId = (uint8_t)ptCANUserData->m_canrx->Identifier; - rd_ComIDSend(g_ptFDCAN1, iCANId, _pBuffer, _iSize); return _iSize; } +static void decode_RS485_1(const char *_pBuffer, uint32_t _iSize) +{ + rd_ComSend(g_ptRS485_1, (char *)_pBuffer, _iSize); +} + +static void decode_RS485_2(const char *_pBuffer, uint32_t _iSize) +{ + rd_ComSend(g_ptRS485_2, (char *)_pBuffer, _iSize); +} + +static void decode_Spoolend(const char *_pBuffer, uint32_t _iSize) +{ + TCANUserData *ptCANUserData = (TCANUserData *)g_ptFDCAN1->m_pUserData; + uint32_t iCANId = (uint32_t)ptCANUserData->m_canrx->Identifier; + rd_ComIDWrite(g_ptFDCAN1, iCANId, (char *)_pBuffer, _iSize); +} + static int FDCAN1_Send(char *_pBuffer, uint32_t _iSize) { - return CAN_TX_FIFOQ(g_ptFDCAN1, _pBuffer[0], &_pBuffer[4], _iSize); + return CAN_TX_FIFOQ(g_ptFDCAN1, _pBuffer, _iSize); } void HAL_FDCAN_ErrorStatusCallback(FDCAN_HandleTypeDef *hfdcan, uint32_t ErrorStatusITs) @@ -154,13 +167,13 @@ int Myprint_putchar(uint8_t ch) void SpoolendInit(void) { TUartUserData *ptUartUserData = UART_userdata_init(0, 115200, 512); - g_ptRS485_1 = rd_ComCreate(check_RS485_1, NULL, RS485_1_Send, ptUartUserData->m_buf_size, ptUartUserData); + g_ptRS485_1 = rd_ComCreate(check_RS485_1, decode_RS485_1, RS485_1_Send, ptUartUserData->m_buf_size, ptUartUserData); UART_IT_init(g_ptRS485_1); // TUartUserData *ptUartUserData1 = UART_userdata_init(0, 115200, 512); -// g_ptRS485_2 = rd_ComCreate(check_RS485_2, NULL, RS485_2_Send, ptUartUserData1->m_buf_size, ptUartUserData1); +// g_ptRS485_2 = rd_ComCreate(check_RS485_2, decode_RS485_2, RS485_2_Send, ptUartUserData1->m_buf_size, ptUartUserData1); // UART_IT_init(g_ptRS485_2); TCANUserData *ptCANUserData = CAN_userdata_init(&hfdcan1, 8, 0); - g_ptFDCAN1 = rd_ComCreate(check_Spoolend, NULL, FDCAN1_Send, CONFIG_UART_BUFFER_SIZE, ptCANUserData); + g_ptFDCAN1 = rd_ComCreate(check_Spoolend, decode_Spoolend, FDCAN1_Send, CONFIG_UART_BUFFER_SIZE, ptCANUserData); CAN_IT_init(g_ptFDCAN1); } @@ -178,6 +191,7 @@ void SpoolendTask(void) HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin); + rd_ComSendProc(g_ptFDCAN1); HAL_Delay(500); }