From 3f03b4c3bc373eae31a8f034eedf81039555ad1e Mon Sep 17 00:00:00 2001 From: zhangzheng <1358745329@qq.com> Date: Fri, 6 Oct 2023 21:18:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=B8=AAipc?= =?UTF-8?q?=E4=BC=A0=E8=BE=93=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mkrtos_knl/knl/ipc.c | 5 + mkrtos_user/lib/modbus/inc/MD_RTU_Config.h | 3 + .../src/modbus_rtu_master/MDM_RTU_Fun.c | 2341 +++++++++-------- mkrtos_user/lib/sys/inc/u_types.h | 2 +- mkrtos_user/lib/sys_svr/src/fs_cli.c | 8 +- mkrtos_user/lib/sys_svr/src/ns_cli.c | 19 +- mkrtos_user/lib/sys_svr/src/ns_svr.c | 121 +- mkrtos_user/lib/sys_util/inc/u_rpc.h | 93 +- mkrtos_user/server/app/drv/drv.c | 11 +- mkrtos_user/server/app/drv/e180-zg120.c | 2 + mkrtos_user/server/app/drv/spi2.c | 2 +- mkrtos_user/server/app/drv/sysinfo.c | 4 +- mkrtos_user/server/app/drv/sysinfo.h | 1 + mkrtos_user/server/app/drv/uart5.c | 19 +- mkrtos_user/server/app/drv/wk2xx_hw.c | 3 +- .../server/app/hmi_lcd/hmi_lcd_process.c | 2 - .../server/app/modbus/MDM_RTU_Serial.c | 3 +- mkrtos_user/server/app/src/main.c | 7 +- mkrtos_user/server/app/util/temp_cal.c | 25 +- mkrtos_user/server/app/util/temp_cal.h | 2 +- mkrtos_user/server/init/src/namespace.c | 6 +- setting.cmake | 2 +- 22 files changed, 1369 insertions(+), 1312 deletions(-) diff --git a/mkrtos_knl/knl/ipc.c b/mkrtos_knl/knl/ipc.c index ca90e5591..d26e0fd57 100755 --- a/mkrtos_knl/knl/ipc.c +++ b/mkrtos_knl/knl/ipc.c @@ -371,6 +371,11 @@ static msg_tag_t ipc_wait(ipc_t *ipc, thread_t *th, entry_frame_t *f, msg_tag_t tag = th->msg.tag; } } + else + { + preemption(); + tag = th->msg.tag; + } spinlock_set(&ipc->lock, status); return tag; } diff --git a/mkrtos_user/lib/modbus/inc/MD_RTU_Config.h b/mkrtos_user/lib/modbus/inc/MD_RTU_Config.h index c87fa846b..2e1ef94ee 100644 --- a/mkrtos_user/lib/modbus/inc/MD_RTU_Config.h +++ b/mkrtos_user/lib/modbus/inc/MD_RTU_Config.h @@ -8,6 +8,9 @@ #define MD_RTU_USED_OS 0 ///< Whether modbus RTU USES an operating system +#define MD_STRICT_MODE 0 ///< Strict mode +#define MD_FRAME_INTERVAL_TIME 5 ///< Ms + #define MD_RTU_CRC16_FAST_MODE 1 ///< CRC check mode configuration ///< Configuration related to the slave diff --git a/mkrtos_user/lib/modbus/src/modbus_rtu_master/MDM_RTU_Fun.c b/mkrtos_user/lib/modbus/src/modbus_rtu_master/MDM_RTU_Fun.c index 10b83740d..aa8a59e3a 100644 --- a/mkrtos_user/lib/modbus/src/modbus_rtu_master/MDM_RTU_Fun.c +++ b/mkrtos_user/lib/modbus/src/modbus_rtu_master/MDM_RTU_Fun.c @@ -1,12 +1,12 @@ /******************************************************************************** -* @File name: MDM_RTU_Fun.c -* @Author: zspace -* @Emial: 1358745329@qq.com -* @Version: 1.0 -* @Date: 2020-4-10 -* @Description: Modbus RTU host function module -* Open source address: https://github.com/lotoohe-space/XTinyModbus -********************************************************************************/ + * @File name: MDM_RTU_Fun.c + * @Author: zspace + * @Emial: 1358745329@qq.com + * @Version: 1.0 + * @Date: 2020-4-10 + * @Description: Modbus RTU host function module + * Open source address: https://github.com/lotoohe-space/XTinyModbus + ********************************************************************************/ /*********************************THE HEADER FILE CONTAINS************************************/ #include "MDM_RTU_Fun.h" @@ -20,280 +20,337 @@ /*********************************FUNCTION DECLARATION************************************/ #if !MDM_USE_SEND_CACHE -static void MDM_RTU_SendByte(PModbus_RTU pModbus_RTU,uint8 byte); +static void MDM_RTU_SendByte(PModbus_RTU pModbus_RTU, uint8 byte); #endif -void MDM_RTU_RecvByte(void *obj,uint8 byte); +void MDM_RTU_RecvByte(void *obj, uint8 byte); /*********************************END******************************************/ /******************************************************* -* -* Function name :MDM_RTU_Init -* Description :Modbus RTU Host initialization -* Parameter : -* @pModbusRTU Host object pointer -* @mdRTUSerialInitFun Serial port initialization function -* @baud Baud rate -* @dataBits Data bit -* @stopBits Stop bit -* @parity Parity bit -* Return : reference[MDError] -**********************************************************/ + * + * Function name :MDM_RTU_Init + * Description :Modbus RTU Host initialization + * Parameter : + * @pModbusRTU Host object pointer + * @mdRTUSerialInitFun Serial port initialization function + * @baud Baud rate + * @dataBits Data bit + * @stopBits Stop bit + * @parity Parity bit + * Return : reference[MDError] + **********************************************************/ MDError MDM_RTU_Init( PModbus_RTU pModbusRTU, MD_RTU_SerialInit mdRTUSerialInitFun, uint32 baud, uint8 dataBits, uint8 stopBits, - uint8 parity -){ + uint8 parity) +{ float T; uint8 i; - if(pModbusRTU==NULL){return ERR_VOID;} - + if (pModbusRTU == NULL) + { + return ERR_VOID; + } + #if MD_RTU_USED_OS - if(pModbusRTU->mdRTUMsgHandle==NULL){ - if(!MD_RTU_CreateMsg((PModbusBase)pModbusRTU, &(pModbusRTU->mdRTUMsgHandle),MD_RTU_MSG_BOX_LENGTH)){ + if (pModbusRTU->mdRTUMsgHandle == NULL) + { + if (!MD_RTU_CreateMsg((PModbusBase)pModbusRTU, &(pModbusRTU->mdRTUMsgHandle), MD_RTU_MSG_BOX_LENGTH)) + { return ERR_CTE_OBJ; } } - if(pModbusRTU->mdRTULockHandle==NULL){ - if(!MD_RTU_CreateLock((PModbusBase)pModbusRTU, &(MD_RTU_LOCK_HANDLE_ARG(pModbusRTU)))){ + if (pModbusRTU->mdRTULockHandle == NULL) + { + if (!MD_RTU_CreateLock((PModbusBase)pModbusRTU, &(MD_RTU_LOCK_HANDLE_ARG(pModbusRTU)))) + { return ERR_CTE_OBJ; } } - if(pModbusRTU->mdRTULockObjHandle==NULL){ - if(!MD_RTU_CreateLock((PModbusBase)pModbusRTU, &(MD_RTU_LOCK_OBJ_HANDLE_ARG(pModbusRTU)))){ + if (pModbusRTU->mdRTULockObjHandle == NULL) + { + if (!MD_RTU_CreateLock((PModbusBase)pModbusRTU, &(MD_RTU_LOCK_OBJ_HANDLE_ARG(pModbusRTU)))) + { return ERR_CTE_OBJ; } } - if(pModbusRTU->mdRTULockObj1Handle==NULL){ - if(!MD_RTU_CreateLock((PModbusBase)pModbusRTU, &(MD_RTU_LOCK_OBJ1_HANDLE_ARG(pModbusRTU)))){ + if (pModbusRTU->mdRTULockObj1Handle == NULL) + { + if (!MD_RTU_CreateLock((PModbusBase)pModbusRTU, &(MD_RTU_LOCK_OBJ1_HANDLE_ARG(pModbusRTU)))) + { return ERR_CTE_OBJ; } } - if(pModbusRTU->mdRTUTaskHandle==NULL){ - if(!MD_RTU_CreateThread((PModbusBase)pModbusRTU,MDM_RTU_SysProcessTask,&MD_RTU_TASK_HANDLE_ARG(pModbusRTU))){ + if (pModbusRTU->mdRTUTaskHandle == NULL) + { + if (!MD_RTU_CreateThread((PModbusBase)pModbusRTU, MDM_RTU_SysProcessTask, &MD_RTU_TASK_HANDLE_ARG(pModbusRTU))) + { return ERR_CTE_OBJ; } } #endif - - MD_RTU_LOCK((PModbusBase)pModbusRTU,MD_RTU_LOCK_HANDLE_ARG(pModbusRTU)); - //MDInitQueue(&(pModbusRTU->mdSqQueue),UINT8_TYPE); - pModbusRTU->mdSqQueue.data=NULL; - pModbusRTU->mdSqQueue.maxVal=0; - MD_RTU_UNLOCK((PModbusBase)pModbusRTU,MD_RTU_LOCK_HANDLE_ARG(pModbusRTU)); - - MD_RTU_LOCK((PModbusBase)pModbusRTU,MD_RTU_LOCK_OBJ_HANDLE_ARG(pModbusRTU)); - for(i=0;imdSqQueue),UINT8_TYPE); + pModbusRTU->mdSqQueue.data = NULL; + pModbusRTU->mdSqQueue.maxVal = 0; + MD_RTU_UNLOCK((PModbusBase)pModbusRTU, MD_RTU_LOCK_HANDLE_ARG(pModbusRTU)); + + MD_RTU_LOCK((PModbusBase)pModbusRTU, MD_RTU_LOCK_OBJ_HANDLE_ARG(pModbusRTU)); + for (i = 0; i < MDM_REG_COIL_ITEM_NUM; i++) + { pModbusRTU->pMapTableList[i] = NULL; } - TO_MDBase(pModbusRTU)->mdRTUTimeHandlerFunction=MDM_RTU_TimeHandler; + TO_MDBase(pModbusRTU)->mdRTUTimeHandlerFunction = MDM_RTU_TimeHandler; /*Data sending and receiving related functions*/ - TO_MDBase(pModbusRTU)->mdRTUSendBytesFunction=NULL; - TO_MDBase(pModbusRTU)->mdRTURecByteFunction=MDM_RTU_RecvByte; - TO_MDBase(pModbusRTU)->mdRTURecSendConv=NULL; + TO_MDBase(pModbusRTU)->mdRTUSendBytesFunction = NULL; + TO_MDBase(pModbusRTU)->mdRTURecByteFunction = MDM_RTU_RecvByte; + TO_MDBase(pModbusRTU)->mdRTURecSendConv = NULL; #if MDM_USE_SEND_CACHE - pModbusRTU->serialSendCount=0; + pModbusRTU->serialSendCount = 0; #endif /*The time of the last reception, 0xFFFFFFF means that the detection frame has not started*/ - pModbusRTU->lastTimesTick=0xFFFFFFFF; + pModbusRTU->lastTimesTick = 0xFFFFFFFF; /*Current real-time time unit 100US*/ - pModbusRTU->timesTick=0; - - T=(1.0/(float)baud)*10000; - uint16 time=0; - time=T*(dataBits+(parity?1:0)); - if(stopBits==0){ - time+=T; - }else if(stopBits==1){ - time+=T*1.5f; - }else if(stopBits==2){ - time+=T*2; + pModbusRTU->timesTick = 0; + +#if !MD_STRICT_MODE + pModbusRTU->frameIntervalTime = MD_FRAME_INTERVAL_TIME * 1000 / 10; +#else + T = (1.0 / (float)baud) * 10000; + uint16 time = 0; + time = T * (dataBits + (parity ? 1 : 0)); + if (stopBits == 0) + { + time += T; } - pModbusRTU->frameIntervalTime=time;/*This parameter needs to be set according to the baud rate*/ - - pModbusRTU->recvFlag=0;/*Receive flag*/ - if(mdRTUSerialInitFun!=NULL){ - mdRTUSerialInitFun(pModbusRTU,baud, dataBits,stopBits,parity); + else if (stopBits == 1) + { + time += T * 1.5f; } - MD_RTU_UNLOCK((PModbusBase)pModbusRTU,MD_RTU_LOCK_OBJ_HANDLE_ARG(pModbusRTU)); + else if (stopBits == 2) + { + time += T * 2; + } + pModbusRTU->frameIntervalTime = time; /*This parameter needs to be set according to the baud rate*/ +#endif + pModbusRTU->recvFlag = 0; /*Receive flag*/ + if (mdRTUSerialInitFun != NULL) + { + mdRTUSerialInitFun(pModbusRTU, baud, dataBits, stopBits, parity); + } + MD_RTU_UNLOCK((PModbusBase)pModbusRTU, MD_RTU_LOCK_OBJ_HANDLE_ARG(pModbusRTU)); return ERR_NONE; } /** -* @brief This function init queue. -* @param[in] recvQueueData ???? -* @param[in] recvQueueSize ???? -* @result None -*/ + * @brief This function init queue. + * @param[in] recvQueueData ???? + * @param[in] recvQueueSize ???? + * @result None + */ void MDM_RTU_QueueInit(PModbus_RTU pModbus_RTU, - uint8* recvQueueData, - uint16 recvQueueSize -){ - if(pModbus_RTU==NULL){ - return ; + uint8 *recvQueueData, + uint16 recvQueueSize) +{ + if (pModbus_RTU == NULL) + { + return; } - MD_RTU_LOCK((PModbusBase)pModbus_RTU,MD_RTU_LOCK_HANDLE_ARG(pModbus_RTU)); - MDInitQueue(&(pModbus_RTU->mdSqQueue),recvQueueData,recvQueueSize); - MD_RTU_UNLOCK((PModbusBase)pModbus_RTU,MD_RTU_LOCK_HANDLE_ARG(pModbus_RTU)); + MD_RTU_LOCK((PModbusBase)pModbus_RTU, MD_RTU_LOCK_HANDLE_ARG(pModbus_RTU)); + MDInitQueue(&(pModbus_RTU->mdSqQueue), recvQueueData, recvQueueSize); + MD_RTU_UNLOCK((PModbusBase)pModbus_RTU, MD_RTU_LOCK_HANDLE_ARG(pModbus_RTU)); } /******************************************************* -* -* Function name :MDM_RTU_CB_Init -* Description :Modbus RTU host sends the control block initialization, -* the control block mainly contains information maintenance -* such as the time and frequency of slave transmission -* Parameter : -* @pModbusRTUCB Send control block object pointer -* @pModbusRTU Host object pointer -* @sendIntervalTime Send interval time -* @sendOverTime Send timeout -* @RTTimes Number of retransmissions -* Return : None -**********************************************************/ + * + * Function name :MDM_RTU_CB_Init + * Description :Modbus RTU host sends the control block initialization, + * the control block mainly contains information maintenance + * such as the time and frequency of slave transmission + * Parameter : + * @pModbusRTUCB Send control block object pointer + * @pModbusRTU Host object pointer + * @sendIntervalTime Send interval time + * @sendOverTime Send timeout + * @RTTimes Number of retransmissions + * Return : None + **********************************************************/ void MDM_RTU_CB_Init( - PModbus_RTU_CB pModbusRTUCB - ,PModbus_RTU pModbusRTU - ,uint32 sendIntervalTime - ,uint32 sendOverTime - ,uint8 RTTimes -){ - if(pModbusRTUCB==NULL){return ;} - MD_RTU_LOCK((PModbusBase)pModbusRTU,MD_RTU_LOCK_OBJ_HANDLE_ARG(pModbusRTU)); - pModbusRTUCB->sendIntervalTime=sendIntervalTime; - pModbusRTUCB->pModbus_RTU=pModbusRTU; - pModbusRTUCB->sendTimeTick=MD_RTU_GetSysTick(); - pModbusRTUCB->sendOverTime=sendOverTime; - pModbusRTUCB->RTTimes=RTTimes; - pModbusRTUCB->sendFlag=0; - pModbusRTU->parentObj=NULL; - MD_RTU_UNLOCK((PModbusBase)pModbusRTU,MD_RTU_LOCK_OBJ_HANDLE_ARG(pModbusRTU)); + PModbus_RTU_CB pModbusRTUCB, PModbus_RTU pModbusRTU, uint32 sendIntervalTime, uint32 sendOverTime, uint8 RTTimes) +{ + if (pModbusRTUCB == NULL) + { + return; + } + MD_RTU_LOCK((PModbusBase)pModbusRTU, MD_RTU_LOCK_OBJ_HANDLE_ARG(pModbusRTU)); + pModbusRTUCB->sendIntervalTime = sendIntervalTime; + pModbusRTUCB->pModbus_RTU = pModbusRTU; + pModbusRTUCB->sendTimeTick = MD_RTU_GetSysTick(); + pModbusRTUCB->sendOverTime = sendOverTime; + pModbusRTUCB->RTTimes = RTTimes; + pModbusRTUCB->sendFlag = 0; + pModbusRTU->parentObj = NULL; + MD_RTU_UNLOCK((PModbusBase)pModbusRTU, MD_RTU_LOCK_OBJ_HANDLE_ARG(pModbusRTU)); } /******************************************************* -* -* Function name : MDM_RTU_CB_OverTimeReset -* Description : Send control block timeout reset -* Parameter : -* @pModbusRTUCB Send control block object pointer -* Return : None -**********************************************************/ -void MDM_RTU_CB_OverTimeReset(PModbus_RTU_CB pModbusRTUCB){ - if(pModbusRTUCB==NULL){return ;} - MD_RTU_LOCK((PModbusBase)(pModbusRTUCB->pModbus_RTU),MD_RTU_LOCK_OBJ_HANDLE_ARG((pModbusRTUCB->pModbus_RTU))); - pModbusRTUCB->RTCount=0; - pModbusRTUCB->sendFlag=0; - pModbusRTUCB->sendTimeTick=pModbusRTUCB->pModbus_RTU->timesTick; - MD_RTU_UNLOCK((PModbusBase)(pModbusRTUCB->pModbus_RTU),MD_RTU_LOCK_OBJ_HANDLE_ARG((pModbusRTUCB->pModbus_RTU))); + * + * Function name : MDM_RTU_CB_OverTimeReset + * Description : Send control block timeout reset + * Parameter : + * @pModbusRTUCB Send control block object pointer + * Return : None + **********************************************************/ +void MDM_RTU_CB_OverTimeReset(PModbus_RTU_CB pModbusRTUCB) +{ + if (pModbusRTUCB == NULL) + { + return; + } + MD_RTU_LOCK((PModbusBase)(pModbusRTUCB->pModbus_RTU), MD_RTU_LOCK_OBJ_HANDLE_ARG((pModbusRTUCB->pModbus_RTU))); + pModbusRTUCB->RTCount = 0; + pModbusRTUCB->sendFlag = 0; + pModbusRTUCB->sendTimeTick = pModbusRTUCB->pModbus_RTU->timesTick; + MD_RTU_UNLOCK((PModbusBase)(pModbusRTUCB->pModbus_RTU), MD_RTU_LOCK_OBJ_HANDLE_ARG((pModbusRTUCB->pModbus_RTU))); } /******************************************************* -* -* Function name :MDM_RTU_CB_ClrDisFlag -* Description :Clear disconnection signs -* Parameter : -* @pModbusRTUCB Send control block object pointer -* Return : �� -**********************************************************/ -void MDM_RTU_CB_ClrDisFlag(PModbus_RTU_CB pModbusRTUCB){ - if(pModbusRTUCB==NULL){return ;} - MD_RTU_LOCK((PModbusBase)(pModbusRTUCB->pModbus_RTU),MD_RTU_LOCK_OBJ_HANDLE_ARG((pModbusRTUCB->pModbus_RTU))); + * + * Function name :MDM_RTU_CB_ClrDisFlag + * Description :Clear disconnection signs + * Parameter : + * @pModbusRTUCB Send control block object pointer + * Return : �� + **********************************************************/ +void MDM_RTU_CB_ClrDisFlag(PModbus_RTU_CB pModbusRTUCB) +{ + if (pModbusRTUCB == NULL) + { + return; + } + MD_RTU_LOCK((PModbusBase)(pModbusRTUCB->pModbus_RTU), MD_RTU_LOCK_OBJ_HANDLE_ARG((pModbusRTUCB->pModbus_RTU))); MD_CB_CLR_DIS_FLAG(pModbusRTUCB); - MD_RTU_UNLOCK((PModbusBase)(pModbusRTUCB->pModbus_RTU),MD_RTU_LOCK_OBJ_HANDLE_ARG((pModbusRTUCB->pModbus_RTU))); + MD_RTU_UNLOCK((PModbusBase)(pModbusRTUCB->pModbus_RTU), MD_RTU_LOCK_OBJ_HANDLE_ARG((pModbusRTUCB->pModbus_RTU))); } /******************************************************* -* -* Function name :MDM_RTU_CB_SetDisPollEnFlag -* Description : Set the offline polling enable flag bit. -* Parameter : -* @pModbusRTUCB Send control block object pointer. -* @state The state to be set. -* Return : None -**********************************************************/ -void MDM_RTU_CB_SetDisPollEnFlag(PModbus_RTU_CB pModbusRTUCB,BOOL state){ - if(pModbusRTUCB==NULL){return ;} - MD_RTU_LOCK((PModbusBase)(pModbusRTUCB->pModbus_RTU),MD_RTU_LOCK_OBJ_HANDLE_ARG((pModbusRTUCB->pModbus_RTU))); - if(state){ + * + * Function name :MDM_RTU_CB_SetDisPollEnFlag + * Description : Set the offline polling enable flag bit. + * Parameter : + * @pModbusRTUCB Send control block object pointer. + * @state The state to be set. + * Return : None + **********************************************************/ +void MDM_RTU_CB_SetDisPollEnFlag(PModbus_RTU_CB pModbusRTUCB, BOOL state) +{ + if (pModbusRTUCB == NULL) + { + return; + } + MD_RTU_LOCK((PModbusBase)(pModbusRTUCB->pModbus_RTU), MD_RTU_LOCK_OBJ_HANDLE_ARG((pModbusRTUCB->pModbus_RTU))); + if (state) + { MD_CB_SET_DIS_FLAG_EN(pModbusRTUCB); - }else{ + } + else + { MD_CB_CLR_DIS_FLAG_EN(pModbusRTUCB); } - MD_RTU_UNLOCK((PModbusBase)(pModbusRTUCB->pModbus_RTU),MD_RTU_LOCK_OBJ_HANDLE_ARG((pModbusRTUCB->pModbus_RTU))); + MD_RTU_UNLOCK((PModbusBase)(pModbusRTUCB->pModbus_RTU), MD_RTU_LOCK_OBJ_HANDLE_ARG((pModbusRTUCB->pModbus_RTU))); } /******************************************************* -* -* Function name :MDM_RTU_TimeHandler -* Description :Timing processing function, timing unit 100US -* Parameter : -* @obj Host object pointer -* Return : None -**********************************************************/ -void MDM_RTU_TimeHandler(void *obj,uint32 timesTick){ - PModbus_RTU pModbusRTU=obj; - if(!pModbusRTU){ return; } - //pModbusRTU->timesTick++; - MD_RTU_LOCK((PModbusBase)pModbusRTU,MD_RTU_LOCK_OBJ_HANDLE_ARG(pModbusRTU)); - pModbusRTU->timesTick=timesTick; - /*No need to deal with*/ - if(pModbusRTU->lastTimesTick==0xFFFFFFFF){ - MD_RTU_UNLOCK((PModbusBase)pModbusRTU,MD_RTU_LOCK_OBJ_HANDLE_ARG(pModbusRTU)); - return ; + * + * Function name :MDM_RTU_TimeHandler + * Description :Timing processing function, timing unit 100US + * Parameter : + * @obj Host object pointer + * Return : None + **********************************************************/ +void MDM_RTU_TimeHandler(void *obj, uint32 timesTick) +{ + PModbus_RTU pModbusRTU = obj; + if (!pModbusRTU) + { + return; } - if(pModbusRTU->timesTick-pModbusRTU->lastTimesTick>=pModbusRTU->frameIntervalTime){ - if(pModbusRTU->CRC16Update!=0x0000){ + // pModbusRTU->timesTick++; + MD_RTU_LOCK((PModbusBase)pModbusRTU, MD_RTU_LOCK_OBJ_HANDLE_ARG(pModbusRTU)); + pModbusRTU->timesTick = timesTick; + /*No need to deal with*/ + if (pModbusRTU->lastTimesTick == 0xFFFFFFFF) + { + MD_RTU_UNLOCK((PModbusBase)pModbusRTU, MD_RTU_LOCK_OBJ_HANDLE_ARG(pModbusRTU)); + return; + } + if (pModbusRTU->timesTick - pModbusRTU->lastTimesTick >= pModbusRTU->frameIntervalTime) + { + if (pModbusRTU->CRC16Update != 0x0000) + { /*CRC error*/ - MD_RTU_LOCK((PModbusBase)(pModbusRTU),MD_RTU_LOCK_HANDLE_ARG((pModbusRTU))); + MD_RTU_LOCK((PModbusBase)(pModbusRTU), MD_RTU_LOCK_HANDLE_ARG((pModbusRTU))); MDResetQueue(&(pModbusRTU->mdSqQueue)); - MD_RTU_UNLOCK((PModbusBase)(pModbusRTU),MD_RTU_LOCK_HANDLE_ARG((pModbusRTU))); - pModbusRTU->lastTimesTick=0xFFFFFFFF; - MD_RTU_UNLOCK((PModbusBase)pModbusRTU,MD_RTU_LOCK_OBJ_HANDLE_ARG(pModbusRTU)); - return ; + MD_RTU_UNLOCK((PModbusBase)(pModbusRTU), MD_RTU_LOCK_HANDLE_ARG((pModbusRTU))); + pModbusRTU->lastTimesTick = 0xFFFFFFFF; + MD_RTU_UNLOCK((PModbusBase)pModbusRTU, MD_RTU_LOCK_OBJ_HANDLE_ARG(pModbusRTU)); + return; } /*End of one frame*/ - pModbusRTU->recvFlag=1; - pModbusRTU->lastTimesTick=0xFFFFFFFF; + pModbusRTU->recvFlag = 1; + pModbusRTU->lastTimesTick = 0xFFFFFFFF; } - MD_RTU_UNLOCK((PModbusBase)pModbusRTU,MD_RTU_LOCK_OBJ_HANDLE_ARG(pModbusRTU)); + MD_RTU_UNLOCK((PModbusBase)pModbusRTU, MD_RTU_LOCK_OBJ_HANDLE_ARG(pModbusRTU)); } /******************************************************* -* -* Function name :MDM_RTU_RecvByte -* Description :This function receives data and puts it in the queue -* Parameter : -* @obj Host object pointer -* @byte A byte received -* Return : None -**********************************************************/ -void MDM_RTU_RecvByte(void *obj,uint8 byte){ - PModbus_RTU pModbusRTU=obj; - if(!pModbusRTU){ return; } - MD_RTU_LOCK((PModbusBase)(pModbusRTU),MD_RTU_LOCK_HANDLE_ARG((pModbusRTU))); - if(MDenQueue(&(pModbusRTU->mdSqQueue),&byte,UINT8_TYPE)==FALSE){ - MD_RTU_UNLOCK((PModbusBase)(pModbusRTU),MD_RTU_LOCK_HANDLE_ARG((pModbusRTU))); - return ; + * + * Function name :MDM_RTU_RecvByte + * Description :This function receives data and puts it in the queue + * Parameter : + * @obj Host object pointer + * @byte A byte received + * Return : None + **********************************************************/ +void MDM_RTU_RecvByte(void *obj, uint8 byte) +{ + PModbus_RTU pModbusRTU = obj; + if (!pModbusRTU) + { + return; } - MD_RTU_UNLOCK((PModbusBase)(pModbusRTU),MD_RTU_LOCK_HANDLE_ARG((pModbusRTU))); - MD_RTU_LOCK((PModbusBase)pModbusRTU,MD_RTU_LOCK_OBJ_HANDLE_ARG(pModbusRTU)); - if(pModbusRTU->lastTimesTick==0xFFFFFFFF){ - pModbusRTU->CRC16Update=0xFFFF; + MD_RTU_LOCK((PModbusBase)(pModbusRTU), MD_RTU_LOCK_HANDLE_ARG((pModbusRTU))); + if (MDenQueue(&(pModbusRTU->mdSqQueue), &byte, UINT8_TYPE) == FALSE) + { + MD_RTU_UNLOCK((PModbusBase)(pModbusRTU), MD_RTU_LOCK_HANDLE_ARG((pModbusRTU))); + return; } - pModbusRTU->CRC16Update=MD_CRC16Update(pModbusRTU->CRC16Update,byte); + MD_RTU_UNLOCK((PModbusBase)(pModbusRTU), MD_RTU_LOCK_HANDLE_ARG((pModbusRTU))); + MD_RTU_LOCK((PModbusBase)pModbusRTU, MD_RTU_LOCK_OBJ_HANDLE_ARG(pModbusRTU)); + if (pModbusRTU->lastTimesTick == 0xFFFFFFFF) + { + pModbusRTU->CRC16Update = 0xFFFF; + } + pModbusRTU->CRC16Update = MD_CRC16Update(pModbusRTU->CRC16Update, byte); /*Save the timestamp of the last character received*/ - pModbusRTU->lastTimesTick=pModbusRTU->timesTick; - MD_RTU_UNLOCK((PModbusBase)pModbusRTU,MD_RTU_LOCK_OBJ_HANDLE_ARG(pModbusRTU)); + pModbusRTU->lastTimesTick = pModbusRTU->timesTick; + MD_RTU_UNLOCK((PModbusBase)pModbusRTU, MD_RTU_LOCK_OBJ_HANDLE_ARG(pModbusRTU)); } -#if MD_RTU_USED_OS ///< used os -void MDM_RTU_SysProcessTask(void *arg){ - PModbus_RTU pModbusRTU=(PModbus_RTU)arg; - for(;;){ - void *msg=NULL; - while(1){ - if(MD_RTU_MSG_GET((PModbusBase)pModbusRTU,MD_RTU_MSG_HANDLE_ARG(pModbusRTU),&msg,0)){ - MDM_RTU_RecvByte((void*)pModbusRTU,(uint8)(msg)); - }else{ +#if MD_RTU_USED_OS ///< used os +void MDM_RTU_SysProcessTask(void *arg) +{ + PModbus_RTU pModbusRTU = (PModbus_RTU)arg; + for (;;) + { + void *msg = NULL; + while (1) + { + if (MD_RTU_MSG_GET((PModbusBase)pModbusRTU, MD_RTU_MSG_HANDLE_ARG(pModbusRTU), &msg, 0)) + { + MDM_RTU_RecvByte((void *)pModbusRTU, (uint8)(msg)); + } + else + { break; } } - MDM_RTU_TimeHandler((void*)pModbusRTU,MD_RTU_GetSysTick()); + MDM_RTU_TimeHandler((void *)pModbusRTU, MD_RTU_GetSysTick()); MD_RTU_Delay(5); } } @@ -301,241 +358,286 @@ void MDM_RTU_SysProcessTask(void *arg){ #if !MDM_USE_SEND_CACHE /******************************************************* -* -* Function name :MDM_RTU_SendByte -* Description :����һ���ֽ� -* Parameter : -* @pModbus_RTU ��������ָ�� -* @byte ���͵�һ���ֽ� -* Return : �� -**********************************************************/ -static void MDM_RTU_SendByte(PModbus_RTU pModbus_RTU,uint8 byte){ - if(!pModbus_RTU){ return; } - TO_MDBase(pModbus_RTU)->mdRTUSendBytesFunction(&byte,1); + * + * Function name :MDM_RTU_SendByte + * Description :����һ���ֽ� + * Parameter : + * @pModbus_RTU ��������ָ�� + * @byte ���͵�һ���ֽ� + * Return : �� + **********************************************************/ +static void MDM_RTU_SendByte(PModbus_RTU pModbus_RTU, uint8 byte) +{ + if (!pModbus_RTU) + { + return; + } + TO_MDBase(pModbus_RTU)->mdRTUSendBytesFunction(&byte, 1); } #endif /******************************************************* -* -* Function name :MDM_RTU_AddMapItem -* Description :This function adds a mapping record to the discrete mapping table -* Parameter : -* @pModbusRTU Host structure pointer -* @pRegCoilItem Items to be added -* Return : None -**********************************************************/ -BOOL MDM_RTU_AddMapItem(PModbus_RTU pModbusRTU,PMapTableItem pMapTableItem){ + * + * Function name :MDM_RTU_AddMapItem + * Description :This function adds a mapping record to the discrete mapping table + * Parameter : + * @pModbusRTU Host structure pointer + * @pRegCoilItem Items to be added + * Return : None + **********************************************************/ +BOOL MDM_RTU_AddMapItem(PModbus_RTU pModbusRTU, PMapTableItem pMapTableItem) +{ BOOL res; - if(pModbusRTU==NULL || pMapTableItem==NULL){ - return FALSE; + if (pModbusRTU == NULL || pMapTableItem == NULL) + { + return FALSE; } - MD_RTU_LOCK((PModbusBase)(pModbusRTU),MD_RTU_LOCK_OBJ_HANDLE_ARG((pModbusRTU))); - res=MapTableAdd(pModbusRTU->pMapTableList, pMapTableItem,MDM_REG_COIL_ITEM_NUM); - MD_RTU_UNLOCK((PModbusBase)(pModbusRTU),MD_RTU_LOCK_OBJ_HANDLE_ARG((pModbusRTU))); + MD_RTU_LOCK((PModbusBase)(pModbusRTU), MD_RTU_LOCK_OBJ_HANDLE_ARG((pModbusRTU))); + res = MapTableAdd(pModbusRTU->pMapTableList, pMapTableItem, MDM_REG_COIL_ITEM_NUM); + MD_RTU_UNLOCK((PModbusBase)(pModbusRTU), MD_RTU_LOCK_OBJ_HANDLE_ARG((pModbusRTU))); return res; } /******************************************************* -* -* Function name :MDM_RTU_ReadByte -* Description :Get data from the receiving queue -* Parameter : -* @pModbus_RTU Host object pointer -* @res Get the data cache -* @len The length of the data obtained -* Return : None -**********************************************************/ -MDError MDM_RTU_ReadByte(PModbus_RTU pModbusRTU,uint8 *res,uint8 len){ + * + * Function name :MDM_RTU_ReadByte + * Description :Get data from the receiving queue + * Parameter : + * @pModbus_RTU Host object pointer + * @res Get the data cache + * @len The length of the data obtained + * Return : None + **********************************************************/ +MDError MDM_RTU_ReadByte(PModbus_RTU pModbusRTU, uint8 *res, uint8 len) +{ uint8 i; uint8 resI; - if(res==NULL){return ERR_VOID;} - for(i=0;imdSqQueue),(res+i),UINT8_TYPE); - MD_RTU_UNLOCK((PModbusBase)(pModbusRTU),MD_RTU_LOCK_HANDLE_ARG((pModbusRTU))); - if(!resI){ + if (res == NULL) + { + return ERR_VOID; + } + for (i = 0; i < len; i++) + { + MD_RTU_LOCK((PModbusBase)(pModbusRTU), MD_RTU_LOCK_HANDLE_ARG((pModbusRTU))); + resI = MDdeQueue(&(pModbusRTU->mdSqQueue), (res + i), UINT8_TYPE); + MD_RTU_UNLOCK((PModbusBase)(pModbusRTU), MD_RTU_LOCK_HANDLE_ARG((pModbusRTU))); + if (!resI) + { return ERR_QUEUE; } } return ERR_NONE; } /******************************************************* -* -* Function name :MDM_RTU_ReadUint16 -* Description :Get data from the receiving queue -* Parameter : -* @pModbus_RTU Host object pointer -* @res Get data cache -* @len The length of the data obtained -* Return : None -**********************************************************/ -MDError MDM_RTU_ReadUint16(PModbus_RTU pModbusRTU,uint16 *res,uint8 len){ + * + * Function name :MDM_RTU_ReadUint16 + * Description :Get data from the receiving queue + * Parameter : + * @pModbus_RTU Host object pointer + * @res Get data cache + * @len The length of the data obtained + * Return : None + **********************************************************/ +MDError MDM_RTU_ReadUint16(PModbus_RTU pModbusRTU, uint16 *res, uint8 len) +{ uint8 i; uint8 byte; - if(res==NULL){return ERR_VOID;} - MD_RTU_LOCK((PModbusBase)(pModbusRTU),MD_RTU_LOCK_HANDLE_ARG((pModbusRTU))); - for(i=0;imdSqQueue),&byte,UINT8_TYPE)){ - MD_RTU_UNLOCK((PModbusBase)(pModbusRTU),MD_RTU_LOCK_HANDLE_ARG((pModbusRTU))); - return ERR_QUEUE; - } - res[i]=byte<<8; - if(!MDdeQueue(&(pModbusRTU->mdSqQueue),&byte,UINT8_TYPE)){ - MD_RTU_UNLOCK((PModbusBase)(pModbusRTU),MD_RTU_LOCK_HANDLE_ARG((pModbusRTU))); - return ERR_QUEUE; - } - res[i]|=byte; + if (res == NULL) + { + return ERR_VOID; } - MD_RTU_UNLOCK((PModbusBase)(pModbusRTU),MD_RTU_LOCK_HANDLE_ARG((pModbusRTU))); + MD_RTU_LOCK((PModbusBase)(pModbusRTU), MD_RTU_LOCK_HANDLE_ARG((pModbusRTU))); + for (i = 0; i < len; i++) + { + if (!MDdeQueue(&(pModbusRTU->mdSqQueue), &byte, UINT8_TYPE)) + { + MD_RTU_UNLOCK((PModbusBase)(pModbusRTU), MD_RTU_LOCK_HANDLE_ARG((pModbusRTU))); + return ERR_QUEUE; + } + res[i] = byte << 8; + if (!MDdeQueue(&(pModbusRTU->mdSqQueue), &byte, UINT8_TYPE)) + { + MD_RTU_UNLOCK((PModbusBase)(pModbusRTU), MD_RTU_LOCK_HANDLE_ARG((pModbusRTU))); + return ERR_QUEUE; + } + res[i] |= byte; + } + MD_RTU_UNLOCK((PModbusBase)(pModbusRTU), MD_RTU_LOCK_HANDLE_ARG((pModbusRTU))); return ERR_NONE; } /******************************************************* -* -* Function name :MDM_RTU_ReadFun -* Description :This function sends commands related to the read function -* Parameter : -* @pModbus_RTU Host object pointer -* @funCode function code -* @slaveAddr Slave address -* @startAddr Read start address -* @numOf Number of reads -* Return : None -**********************************************************/ -static void MDM_RTU_ReadFun(PModbus_RTU pModbus_RTU,uint8 funCode,uint8 slaveAddr,uint16 startAddr,uint16 numOf){ + * + * Function name :MDM_RTU_ReadFun + * Description :This function sends commands related to the read function + * Parameter : + * @pModbus_RTU Host object pointer + * @funCode function code + * @slaveAddr Slave address + * @startAddr Read start address + * @numOf Number of reads + * Return : None + **********************************************************/ +static void MDM_RTU_ReadFun(PModbus_RTU pModbus_RTU, uint8 funCode, uint8 slaveAddr, uint16 startAddr, uint16 numOf) +{ MD_RTU_SEND_MODE(pModbus_RTU); MEM_RTU_START_EN(pModbus_RTU); - MEM_RTU_EN_QUEUE(pModbus_RTU,slaveAddr); - MEM_RTU_EN_QUEUE(pModbus_RTU,funCode); - MEM_RTU_EN_QUEUE(pModbus_RTU,MD_H_BYTE(startAddr)); - MEM_RTU_EN_QUEUE(pModbus_RTU,MD_L_BYTE(startAddr)); - MEM_RTU_EN_QUEUE(pModbus_RTU,MD_H_BYTE(numOf)); - MEM_RTU_EN_QUEUE(pModbus_RTU,MD_L_BYTE(numOf)); + MEM_RTU_EN_QUEUE(pModbus_RTU, slaveAddr); + MEM_RTU_EN_QUEUE(pModbus_RTU, funCode); + MEM_RTU_EN_QUEUE(pModbus_RTU, MD_H_BYTE(startAddr)); + MEM_RTU_EN_QUEUE(pModbus_RTU, MD_L_BYTE(startAddr)); + MEM_RTU_EN_QUEUE(pModbus_RTU, MD_H_BYTE(numOf)); + MEM_RTU_EN_QUEUE(pModbus_RTU, MD_L_BYTE(numOf)); MEM_RTU_END_EN(pModbus_RTU); MD_RTU_RECV_MODE(pModbus_RTU); } /******************************************************* -* -* Function name :MDM_RTU_WriteSingleFun -* Description :Write single coil and register function -* Parameter : -* @pModbus_RTU Host object pointer -* @funCode function code -* @slaveAddr Slave address -* @startAddr Write start address -* @value Value written -* Return : None -**********************************************************/ -static void MDM_RTU_WriteSingleFun(PModbus_RTU pModbus_RTU,uint8 funCode,uint8 slaveAddr,uint16 startAddr,uint16 value){ + * + * Function name :MDM_RTU_WriteSingleFun + * Description :Write single coil and register function + * Parameter : + * @pModbus_RTU Host object pointer + * @funCode function code + * @slaveAddr Slave address + * @startAddr Write start address + * @value Value written + * Return : None + **********************************************************/ +static void MDM_RTU_WriteSingleFun(PModbus_RTU pModbus_RTU, uint8 funCode, uint8 slaveAddr, uint16 startAddr, uint16 value) +{ MD_RTU_SEND_MODE(pModbus_RTU); MEM_RTU_START_EN(pModbus_RTU); - MEM_RTU_EN_QUEUE(pModbus_RTU,slaveAddr); - MEM_RTU_EN_QUEUE(pModbus_RTU,funCode); - MEM_RTU_EN_QUEUE(pModbus_RTU,MD_H_BYTE(startAddr)); - MEM_RTU_EN_QUEUE(pModbus_RTU,MD_L_BYTE(startAddr)); - MEM_RTU_EN_QUEUE(pModbus_RTU,MD_H_BYTE(value)); - MEM_RTU_EN_QUEUE(pModbus_RTU,MD_L_BYTE(value)); + MEM_RTU_EN_QUEUE(pModbus_RTU, slaveAddr); + MEM_RTU_EN_QUEUE(pModbus_RTU, funCode); + MEM_RTU_EN_QUEUE(pModbus_RTU, MD_H_BYTE(startAddr)); + MEM_RTU_EN_QUEUE(pModbus_RTU, MD_L_BYTE(startAddr)); + MEM_RTU_EN_QUEUE(pModbus_RTU, MD_H_BYTE(value)); + MEM_RTU_EN_QUEUE(pModbus_RTU, MD_L_BYTE(value)); MEM_RTU_END_EN(pModbus_RTU); MD_RTU_RECV_MODE(pModbus_RTU); } /******************************************************* -* -* Function name :MDM_RTU_WriteFun -* Description :Write multiple coils and multiple registers -* Parameter : -* @pModbus_RTU Host object pointer -* @funCode function code -* @slaveAddr Slave address -* @startAddr Write start address -* @numOf Number of data written -* @data Data written -* Return : None -**********************************************************/ + * + * Function name :MDM_RTU_WriteFun + * Description :Write multiple coils and multiple registers + * Parameter : + * @pModbus_RTU Host object pointer + * @funCode function code + * @slaveAddr Slave address + * @startAddr Write start address + * @numOf Number of data written + * @data Data written + * Return : None + **********************************************************/ static void MDM_RTU_WriteFun(PModbus_RTU pModbus_RTU, - uint8 funCode,uint8 slaveAddr,uint16 startAddr,uint8 numOf,uint8 *data){ + uint8 funCode, uint8 slaveAddr, uint16 startAddr, uint8 numOf, uint8 *data) +{ uint16 i; uint8 wLen; MD_RTU_SEND_MODE(pModbus_RTU); MEM_RTU_START_EN(pModbus_RTU); - MEM_RTU_EN_QUEUE(pModbus_RTU,slaveAddr); - MEM_RTU_EN_QUEUE(pModbus_RTU,funCode); - MEM_RTU_EN_QUEUE(pModbus_RTU,MD_H_BYTE(startAddr)); - MEM_RTU_EN_QUEUE(pModbus_RTU,MD_L_BYTE(startAddr)); - MEM_RTU_EN_QUEUE(pModbus_RTU,MD_H_BYTE(numOf)); - MEM_RTU_EN_QUEUE(pModbus_RTU,MD_L_BYTE(numOf)); - if(funCode==15){ - wLen=(numOf>>3) + ((numOf%8)?1:0); - }else if(funCode==16){ - wLen=numOf<<1; + MEM_RTU_EN_QUEUE(pModbus_RTU, slaveAddr); + MEM_RTU_EN_QUEUE(pModbus_RTU, funCode); + MEM_RTU_EN_QUEUE(pModbus_RTU, MD_H_BYTE(startAddr)); + MEM_RTU_EN_QUEUE(pModbus_RTU, MD_L_BYTE(startAddr)); + MEM_RTU_EN_QUEUE(pModbus_RTU, MD_H_BYTE(numOf)); + MEM_RTU_EN_QUEUE(pModbus_RTU, MD_L_BYTE(numOf)); + if (funCode == 15) + { + wLen = (numOf >> 3) + ((numOf % 8) ? 1 : 0); } - MEM_RTU_EN_QUEUE(pModbus_RTU,wLen); - if(funCode == 15){ - for(i=0;i>8)); - MEM_RTU_EN_QUEUE(pModbus_RTU,(tempData[i]&0xff)); + } + else if (funCode == 16) + { + uint16 *tempData = (uint16 *)data; + for (i = 0; i < numOf; i++) + { + MEM_RTU_EN_QUEUE(pModbus_RTU, (tempData[i] >> 8)); + MEM_RTU_EN_QUEUE(pModbus_RTU, (tempData[i] & 0xff)); } - } + } MEM_RTU_END_EN(pModbus_RTU); MD_RTU_RECV_MODE(pModbus_RTU); } /******************************************************* -* -* Function name :MDM_RTU_InsideWriteBits -* Description :Write bits to the discrete map -* Parameter : -* @obj Host object pointer -* @modbusAddr Discretely mapped modbus address -* @numOf Write number -* @bit Data written -* @opAddrType Write address type (COILS_TYPE, INPUT_TYPE), see [AddrType] -* Return : TRUE , FALSE -**********************************************************/ + * + * Function name :MDM_RTU_InsideWriteBits + * Description :Write bits to the discrete map + * Parameter : + * @obj Host object pointer + * @modbusAddr Discretely mapped modbus address + * @numOf Write number + * @bit Data written + * @opAddrType Write address type (COILS_TYPE, INPUT_TYPE), see [AddrType] + * Return : TRUE , FALSE + **********************************************************/ BOOL MDM_RTU_InsideWriteBits( - void* obj, + void *obj, uint16 modbusAddr, - uint16 numOf, - uint8 *bit, + uint16 numOf, + uint8 *bit, AddrType opAddrType, - uint8 devAddr -){ + uint8 devAddr) +{ uint16 i; PModbus_RTU pModbus_RTU = obj; - if(pModbus_RTU==NULL){return FALSE;} - if(opAddrType != COILS_TYPE && opAddrType != INPUT_TYPE){return FALSE;} - - for(i=0;ipMapTableList[i]==NULL){ + if (pModbus_RTU == NULL) + { + return FALSE; + } + if (opAddrType != COILS_TYPE && opAddrType != INPUT_TYPE) + { + return FALSE; + } + + for (i = 0; i < MDM_REG_COIL_ITEM_NUM; i++) + { + if (pModbus_RTU->pMapTableList[i] == NULL) + { continue; } /*Check the device number*/ - if(devAddr!=pModbus_RTU->pMapTableList[i]->devAddr){continue;} - - if(pModbus_RTU->pMapTableList[i]->modbusAddr<=modbusAddr&& - (pModbus_RTU->pMapTableList[i]->modbusAddr+pModbus_RTU->pMapTableList[i]->modbusDataSize)>=(modbusAddr+numOf) - ){ - if(pModbus_RTU->pMapTableList[i]->addrType==opAddrType){/*Must be BIT type*/ - uint16 offsetAddr=modbusAddr-MDS_RTU_REG_COIL_ITEM_ADDR(pModbus_RTU->pMapTableList[i]); + if (devAddr != pModbus_RTU->pMapTableList[i]->devAddr) + { + continue; + } + + if (pModbus_RTU->pMapTableList[i]->modbusAddr <= modbusAddr && + (pModbus_RTU->pMapTableList[i]->modbusAddr + pModbus_RTU->pMapTableList[i]->modbusDataSize) >= (modbusAddr + numOf)) + { + if (pModbus_RTU->pMapTableList[i]->addrType == opAddrType) + { /*Must be BIT type*/ + uint16 offsetAddr = modbusAddr - MDS_RTU_REG_COIL_ITEM_ADDR(pModbus_RTU->pMapTableList[i]); uint16 j; - MD_RTU_LOCK((PModbusBase)(pModbus_RTU),MD_RTU_LOCK_OBJ_HANDLE_ARG((pModbus_RTU))); - for(j=0;j>3] ,j%8) - ){ + MD_RTU_LOCK((PModbusBase)(pModbus_RTU), MD_RTU_LOCK_OBJ_HANDLE_ARG((pModbus_RTU))); + for (j = 0; j < numOf; j++) + { + if ( + MD_GET_BIT(bit[j >> 3], j % 8)) + { MD_SET_BIT( MDS_RTU_REG_COIL_ITEM_DATA( - pModbus_RTU->pMapTableList[i])[(offsetAddr+j)>>4] - ,(j+offsetAddr)%16); - }else{ + pModbus_RTU->pMapTableList[i])[(offsetAddr + j) >> 4], + (j + offsetAddr) % 16); + } + else + { MD_CLR_BIT( MDS_RTU_REG_COIL_ITEM_DATA( - pModbus_RTU->pMapTableList[i])[(offsetAddr+j)>>4] - ,(j+offsetAddr)%16); + pModbus_RTU->pMapTableList[i])[(offsetAddr + j) >> 4], + (j + offsetAddr) % 16); } } - MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU),MD_RTU_LOCK_OBJ_HANDLE_ARG((pModbus_RTU))); + MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU), MD_RTU_LOCK_OBJ_HANDLE_ARG((pModbus_RTU))); return TRUE; } } @@ -543,51 +645,65 @@ BOOL MDM_RTU_InsideWriteBits( return FALSE; } /******************************************************* -* -* Function name :MDM_RTU_InsideWriteRegs -* Description :Write discrete register -* Parameter : -* @obj Host object pointer -* @modbusAddr Discretely mapped modbus address -* @numOf Write number -* @reg Data written -* @isBigE Big-endian or little-endian -* @opAddrType Write address type (HOLD_REGS_TYPE, INPUT_REGS_TYPE), see [AddrType] -* Return : TRUE , FALSE -**********************************************************/ + * + * Function name :MDM_RTU_InsideWriteRegs + * Description :Write discrete register + * Parameter : + * @obj Host object pointer + * @modbusAddr Discretely mapped modbus address + * @numOf Write number + * @reg Data written + * @isBigE Big-endian or little-endian + * @opAddrType Write address type (HOLD_REGS_TYPE, INPUT_REGS_TYPE), see [AddrType] + * Return : TRUE , FALSE + **********************************************************/ BOOL MDM_RTU_InsideWriteRegs( -void* obj, -uint16 modbusAddr, -uint16 numOf, -uint16 *reg, -uint8 isBigE, -AddrType opAddrType, -uint8 devAddr -){ + void *obj, + uint16 modbusAddr, + uint16 numOf, + uint16 *reg, + uint8 isBigE, + AddrType opAddrType, + uint8 devAddr) +{ uint16 i; PModbus_RTU pModbus_RTU = obj; - if(pModbus_RTU==NULL){return FALSE;} - if(opAddrType != HOLD_REGS_TYPE && opAddrType != INPUT_REGS_TYPE){return FALSE;} - - for(i=0;ipMapTableList[i]==NULL){ + if (pModbus_RTU == NULL) + { + return FALSE; + } + if (opAddrType != HOLD_REGS_TYPE && opAddrType != INPUT_REGS_TYPE) + { + return FALSE; + } + + for (i = 0; i < MDM_REG_COIL_ITEM_NUM; i++) + { + if (pModbus_RTU->pMapTableList[i] == NULL) + { continue; } /*Check the device number*/ - if(devAddr!=pModbus_RTU->pMapTableList[i]->devAddr){continue;} - - if(pModbus_RTU->pMapTableList[i]->modbusAddr<=modbusAddr&& - (pModbus_RTU->pMapTableList[i]->modbusAddr+pModbus_RTU->pMapTableList[i]->modbusDataSize)>=(modbusAddr+numOf) - ){ - if(pModbus_RTU->pMapTableList[i]->addrType==opAddrType){/*������REG����*/ - uint16 offsetAddr=modbusAddr-MDS_RTU_REG_COIL_ITEM_ADDR(pModbus_RTU->pMapTableList[i]); - uint16 j=0; - MD_RTU_LOCK((PModbusBase)(pModbus_RTU),MD_RTU_LOCK_OBJ_HANDLE_ARG((pModbus_RTU))); - for(j=0;jpMapTableList[i])[offsetAddr+j]= - isBigE?MD_SWAP_HL(reg[j]):reg[j]; - } - MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU),MD_RTU_LOCK_OBJ_HANDLE_ARG((pModbus_RTU))); + if (devAddr != pModbus_RTU->pMapTableList[i]->devAddr) + { + continue; + } + + if (pModbus_RTU->pMapTableList[i]->modbusAddr <= modbusAddr && + (pModbus_RTU->pMapTableList[i]->modbusAddr + pModbus_RTU->pMapTableList[i]->modbusDataSize) >= (modbusAddr + numOf)) + { + if (pModbus_RTU->pMapTableList[i]->addrType == opAddrType) + { + uint16 offsetAddr = modbusAddr - MDS_RTU_REG_COIL_ITEM_ADDR(pModbus_RTU->pMapTableList[i]); + uint16 j = 0; + MD_RTU_LOCK((PModbusBase)(pModbus_RTU), MD_RTU_LOCK_OBJ_HANDLE_ARG((pModbus_RTU))); + for (j = 0; j < numOf; j++) + { + MDS_RTU_REG_COIL_ITEM_DATA(pModbus_RTU->pMapTableList[i]) + [offsetAddr + j] = + isBigE ? MD_SWAP_HL(reg[j]) : reg[j]; + } + MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU), MD_RTU_LOCK_OBJ_HANDLE_ARG((pModbus_RTU))); return TRUE; } } @@ -595,792 +711,895 @@ uint8 devAddr return FALSE; } /******************************************************* -* -* Function name :MDM_RTU_NB_RW -* Description :Non-blocking read and write -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @funCode Function code, see [ModbusFunCode] -* @slaveAddr Slave address -* @startAddr Read and write start address -* @numOf Number of read and write data -* @wData If it is a write function code, then it is the written data -* Return : See [MDError] -**********************************************************/ + * + * Function name :MDM_RTU_NB_RW + * Description :Non-blocking read and write + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @funCode Function code, see [ModbusFunCode] + * @slaveAddr Slave address + * @startAddr Read and write start address + * @numOf Number of read and write data + * @wData If it is a write function code, then it is the written data + * Return : See [MDError] + **********************************************************/ static MDError MDM_RTU_NB_RW( PModbus_RTU_CB pModbus_RTU_CB, ModbusFunCode funCode, uint8 slaveAddr, uint16 startAddr, uint16 numOf, - void *wData -){ + void *wData) +{ MDError errRes; uint8 index; uint16 wAddr; errRes = ERR_NONE; - if(pModbus_RTU_CB==NULL){return ERR_VOID;} - if(pModbus_RTU_CB->pModbus_RTU==NULL){return ERR_VOID;} - - if(MD_CB_GET_DIS_FLAG_EN(pModbus_RTU_CB)/*Enable the drop-off non-polling flag*/ - &&MD_CB_GET_DIS_FLAG(pModbus_RTU_CB)){/*Device dropped*/ + if (pModbus_RTU_CB == NULL) + { + return ERR_VOID; + } + if (pModbus_RTU_CB->pModbus_RTU == NULL) + { + return ERR_VOID; + } + + if (MD_CB_GET_DIS_FLAG_EN(pModbus_RTU_CB) /*Enable the drop-off non-polling flag*/ + && MD_CB_GET_DIS_FLAG(pModbus_RTU_CB)) + { /*Device dropped*/ return ERR_DEV_DIS; } - - if( pModbus_RTU_CB->pModbus_RTU->parentObj!=NULL && - pModbus_RTU_CB!=pModbus_RTU_CB->pModbus_RTU->parentObj){ - //Check if you are using the current Modbus - return ERR_IDLE; + + if (pModbus_RTU_CB->pModbus_RTU->parentObj != NULL && + pModbus_RTU_CB != pModbus_RTU_CB->pModbus_RTU->parentObj) + { + // Check if you are using the current Modbus + return ERR_IDLE; } - pModbus_RTU_CB->pModbus_RTU->blockMode=1;/*set to non-block*/ - if(pModbus_RTU_CB->sendFlag==0){/*Has not been sent, or has been sent successfully*/ + pModbus_RTU_CB->pModbus_RTU->blockMode = 1; /*set to non-block*/ + if (pModbus_RTU_CB->sendFlag == 0) + { /*Has not been sent, or has been sent successfully*/ /*Clear the receive queue*/ MD_RTU_LOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), - MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); + MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); MDResetQueue(&(pModbus_RTU_CB->pModbus_RTU->mdSqQueue)); MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), - MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); - if(funCode>=1 && funCode<=4){ + MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); + if (funCode >= 1 && funCode <= 4) + { /*Have not sent, then send*/ - MDM_RTU_ReadFun(pModbus_RTU_CB->pModbus_RTU,funCode,slaveAddr,startAddr,numOf); + MDM_RTU_ReadFun(pModbus_RTU_CB->pModbus_RTU, funCode, slaveAddr, startAddr, numOf); } - else if(funCode==5||funCode==6){ - if(numOf>=1){/*The length must be greater than or equal to 1*/ - MDM_RTU_WriteSingleFun(pModbus_RTU_CB->pModbus_RTU,funCode,slaveAddr,startAddr,((uint16*)(wData))[0]); + else if (funCode == 5 || funCode == 6) + { + if (numOf >= 1) + { /*The length must be greater than or equal to 1*/ + MDM_RTU_WriteSingleFun(pModbus_RTU_CB->pModbus_RTU, funCode, slaveAddr, startAddr, ((uint16 *)(wData))[0]); } - }else if(funCode==15||funCode==16){ - MDM_RTU_WriteFun(pModbus_RTU_CB->pModbus_RTU,funCode,slaveAddr,startAddr,numOf,(uint8*)(wData)); + } + else if (funCode == 15 || funCode == 16) + { + MDM_RTU_WriteFun(pModbus_RTU_CB->pModbus_RTU, funCode, slaveAddr, startAddr, numOf, (uint8 *)(wData)); } /*Set the start point of timeout*/ - pModbus_RTU_CB->sendTimeTick=pModbus_RTU_CB->pModbus_RTU->timesTick; - - /*Data has been sent, waiting for timeout detection*/ - //MD_SET_SENDED_FLAG(pModbus_RTU_CB); - pModbus_RTU_CB->sendFlag=1; - /*Set the block to be working*/ - pModbus_RTU_CB->pModbus_RTU->parentObj=pModbus_RTU_CB; - return ERR_SEND_FIN; - }else if(pModbus_RTU_CB->RTCountRTTimes){/*It has been sent, and there is no sending error*/ - - if(pModbus_RTU_CB->pModbus_RTU->recvFlag){/*Data received*/ - uint8 byte; - uint8 funCodeByte=0; - /*Clear sign*/ - pModbus_RTU_CB->pModbus_RTU->recvFlag=0; - MD_RTU_LOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), - MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); - if(!MDdeQueue(&(pModbus_RTU_CB->pModbus_RTU->mdSqQueue),&byte,UINT8_TYPE)){ - errRes = ERR_DATA_LEN; - MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), - MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); - goto _exit; - } - MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), - MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); - /*If data is received, process the data*/ - if(slaveAddr!=byte){ - errRes = ERR_SLAVE_ADDR; - goto _exit; - } - MD_RTU_LOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), - MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); - if(!MDdeQueue(&(pModbus_RTU_CB->pModbus_RTU->mdSqQueue),&funCodeByte,UINT8_TYPE)){ - errRes = ERR_DATA_LEN; - MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), - MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); - goto _exit; - } - MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), - MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); - switch(funCodeByte){ - case 0x1:/*Read the coil successfully*/ - case 0x2:/*Read input discrete*/ - { - uint16 i; - MD_RTU_LOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), - MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); - MDdeQueue(&(pModbus_RTU_CB->pModbus_RTU->mdSqQueue),&byte,UINT8_TYPE); - if((byte+2)!=MDQueueLength(&(pModbus_RTU_CB->pModbus_RTU->mdSqQueue))){ - /*Wrong length*/ - errRes = ERR_DATA_LEN; - MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), - MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); - goto _exit; - } - MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), - MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); - index = numOf; - wAddr=startAddr; - for(i=0;ipModbus_RTU), - MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); - if(!MDdeQueue(&(pModbus_RTU_CB->pModbus_RTU->mdSqQueue),&rByte,UINT8_TYPE)){ - /*Wrong length*/ - errRes = ERR_DATA_LEN; - MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), - MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); - goto _exit; - } - MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), - MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); - /*Single deposit is less than or equal to 8bit*/ - if(!MDM_RTU_InsideWriteBits(pModbus_RTU_CB->pModbus_RTU,wAddr,((index<8)?index:8), &rByte,(AddrType)funCodeByte,slaveAddr)){ - errRes= ERR_DATA_SAVE; - goto _exit; - } - wAddr += ((index<8)?index:8); - index-=8; - } -// /*Release channel*/ -// pModbus_RTU_CB->pModbus_RTU->parentObj=NULL; - /*Received from the machine*/ - pModbus_RTU_CB->sendFlag=2; - errRes= ERR_RW_FIN; - goto _exit; - } - case 0x3:/*Read holding register*/ - case 0x4:/*Read input register*/ - { - uint16 i; - uint16 len; - MD_RTU_LOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), - MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); - MDdeQueue(&(pModbus_RTU_CB->pModbus_RTU->mdSqQueue),&byte,UINT8_TYPE); - MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), - MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); - if((byte+2)!=MDQueueLength(&(pModbus_RTU_CB->pModbus_RTU->mdSqQueue))){ - /*Wrong length*/ - errRes= ERR_DATA_LEN; - goto _exit; - } - len=byte>>1; - for(i=0;ipModbus_RTU), - MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); - MDdeQueue(&(pModbus_RTU_CB->pModbus_RTU->mdSqQueue),&rByte,UINT8_TYPE); - wTemp=(rByte<<8); - MDdeQueue(&(pModbus_RTU_CB->pModbus_RTU->mdSqQueue),&rByte,UINT8_TYPE); - wTemp|=rByte; - MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), - MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); - if(!MDM_RTU_InsideWriteRegs(pModbus_RTU_CB->pModbus_RTU,startAddr+i,1,&wTemp,0,(AddrType)funCodeByte,slaveAddr)){ - errRes= ERR_DATA_SAVE; - goto _exit; - } - } - pModbus_RTU_CB->sendFlag=2; - errRes= ERR_RW_FIN; - goto _exit; - } - - case 0x5:/*Write single coil*/ - case 0x6: /*Write a single register*/ - { - uint16 res; - if(MDM_RTU_ReadUint16(pModbus_RTU_CB->pModbus_RTU,&res,1)!=ERR_NONE){ - errRes= ERR_DATA_LEN; - goto _exit; - } - /*Return address mismatch error*/ - if(res!=startAddr){ - errRes= ERR_WRITE_COIL; - goto _exit; - } - if(MDM_RTU_ReadUint16(pModbus_RTU_CB->pModbus_RTU,&res,1)!=ERR_NONE){ - errRes= ERR_DATA_LEN; - goto _exit; - } - /*Return data does not match*/ - if(res!=*((uint16*)wData)){ - errRes= ERR_WRITE_COIL; - goto _exit; - } - pModbus_RTU_CB->sendFlag=2; - errRes= ERR_RW_FIN; - goto _exit; - } - case 0x0F: /*Write multiple coils*/ - case 0x10:{ /*Write multiple registers*/ - uint16 res; - if(MDM_RTU_ReadUint16(pModbus_RTU_CB->pModbus_RTU,&res,1)!=ERR_NONE){ - errRes= ERR_DATA_LEN; - goto _exit; - } - /*Return address mismatch error*/ - if(res!=startAddr){ - errRes= ERR_WRITE_COIL; - goto _exit; - } - if(MDM_RTU_ReadUint16(pModbus_RTU_CB->pModbus_RTU,&res,1)!=ERR_NONE){ - errRes= ERR_DATA_LEN; - goto _exit; - } - /*Return data does not match*/ - if(res!=numOf){ - errRes= ERR_WRITE_COIL; - goto _exit; - } - pModbus_RTU_CB->sendFlag=2; - errRes= ERR_RW_FIN; - goto _exit; - } - case 0x81: pModbus_RTU_CB->sendFlag=3; errRes= ERR_READ_COIL; goto _exit; /*Abnormal reading coil*/ - case 0x82: pModbus_RTU_CB->sendFlag=3; errRes= ERR_READ_INPUT; goto _exit; /*Read input discrete quantity abnormal*/ - case 0x83: pModbus_RTU_CB->sendFlag=3; errRes= ERR_READ_HOLD_REG; goto _exit; /*Read holding register error*/ - case 0x84: pModbus_RTU_CB->sendFlag=3; errRes= ERR_READ_INPUT_REG; goto _exit; /*Error reading input register*/ - case 0x85: pModbus_RTU_CB->sendFlag=3; errRes= ERR_WRITE_COIL; goto _exit; /*Write single coil error*/ - case 0x86: pModbus_RTU_CB->sendFlag=3; errRes= ERR_WRITE_REG; goto _exit; /*Error writing order*/ - case 0x8F: pModbus_RTU_CB->sendFlag=3; errRes= ERR_WRITE_COIL; goto _exit; /*Write multiple coil error*/ - case 0x90: pModbus_RTU_CB->sendFlag=3; errRes= ERR_WRITE_REG; goto _exit; /*Write multiple register error*/ - } + pModbus_RTU_CB->sendTimeTick = pModbus_RTU_CB->pModbus_RTU->timesTick; - } - if(pModbus_RTU_CB->sendFlag==2){/*If the sending is successful, send again*/ - /*Timing resend processing*/ - if(pModbus_RTU_CB->pModbus_RTU->timesTick-pModbus_RTU_CB->sendTimeTick - >=pModbus_RTU_CB->sendIntervalTime){ - /*Resend*/ - //MD_CLR_SENDED_FLAG(pModbus_RTU_CB); - pModbus_RTU_CB->sendFlag=0; - // /*Release channel*/ - // pModbus_RTU_CB->pModbus_RTU->parentObj=NULL; - errRes= ERR_NONE; + /*Data has been sent, waiting for timeout detection*/ + // MD_SET_SENDED_FLAG(pModbus_RTU_CB); + pModbus_RTU_CB->sendFlag = 1; + /*Set the block to be working*/ + pModbus_RTU_CB->pModbus_RTU->parentObj = pModbus_RTU_CB; + return ERR_SEND_FIN; + } + else if (pModbus_RTU_CB->RTCount < pModbus_RTU_CB->RTTimes) + { /*It has been sent, and there is no sending error*/ + + if (pModbus_RTU_CB->pModbus_RTU->recvFlag) + { /*Data received*/ + uint8 byte; + uint8 funCodeByte = 0; + /*Clear sign*/ + pModbus_RTU_CB->pModbus_RTU->recvFlag = 0; + MD_RTU_LOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), + MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); + if (!MDdeQueue(&(pModbus_RTU_CB->pModbus_RTU->mdSqQueue), &byte, UINT8_TYPE)) + { + errRes = ERR_DATA_LEN; + MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), + MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); goto _exit; } - }else if(pModbus_RTU_CB->sendFlag==1 || pModbus_RTU_CB->sendFlag==3){/*�Ѿ������ˣ����ǻ�û�յ���������ִ�г�ʱ���*/ - /*Receive timeout detection*/ - if(pModbus_RTU_CB->pModbus_RTU->timesTick-pModbus_RTU_CB->sendTimeTick - >=pModbus_RTU_CB->sendOverTime){ - /*Set the start point of timeout*/ - pModbus_RTU_CB->sendTimeTick=pModbus_RTU_CB->pModbus_RTU->timesTick; - /*Resend*/ - pModbus_RTU_CB->sendFlag=0; - /*Increase the number of retransmissions by 1*/ - pModbus_RTU_CB->RTCount++; - - /*Release channel*/ - pModbus_RTU_CB->pModbus_RTU->parentObj=NULL; - - if(pModbus_RTU_CB->RTCount>=pModbus_RTU_CB->RTTimes){ - /*The number of retransmissions exceeded*/ - errRes= ERR_RW_OV_TIME_ERR; - if(MD_CB_GET_DIS_FLAG_EN(pModbus_RTU_CB)){/*No polling when disconnected is enabled*/ - MD_CB_SET_DIS_FLAG(pModbus_RTU_CB);/*Device disconnection*/ - } + MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), + MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); + /*If data is received, process the data*/ + if (slaveAddr != byte) + { + errRes = ERR_SLAVE_ADDR; + goto _exit; + } + MD_RTU_LOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), + MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); + if (!MDdeQueue(&(pModbus_RTU_CB->pModbus_RTU->mdSqQueue), &funCodeByte, UINT8_TYPE)) + { + errRes = ERR_DATA_LEN; + MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), + MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); + goto _exit; + } + MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), + MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); + switch (funCodeByte) + { + case 0x1: /*Read the coil successfully*/ + case 0x2: /*Read input discrete*/ + { + uint16 i; + MD_RTU_LOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), + MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); + MDdeQueue(&(pModbus_RTU_CB->pModbus_RTU->mdSqQueue), &byte, UINT8_TYPE); + if ((byte + 2) != MDQueueLength(&(pModbus_RTU_CB->pModbus_RTU->mdSqQueue))) + { + /*Wrong length*/ + errRes = ERR_DATA_LEN; + MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), + MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); + goto _exit; + } + MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), + MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); + index = numOf; + wAddr = startAddr; + for (i = 0; i < byte; i++) + { + uint8 rByte; + MD_RTU_LOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), + MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); + if (!MDdeQueue(&(pModbus_RTU_CB->pModbus_RTU->mdSqQueue), &rByte, UINT8_TYPE)) + { + /*Wrong length*/ + errRes = ERR_DATA_LEN; + MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), + MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); goto _exit; } - /*Timed out*/ - errRes= ERR_OVER_TIME; + MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), + MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); + /*Single deposit is less than or equal to 8bit*/ + if (!MDM_RTU_InsideWriteBits(pModbus_RTU_CB->pModbus_RTU, wAddr, ((index < 8) ? index : 8), &rByte, (AddrType)funCodeByte, slaveAddr)) + { + errRes = ERR_DATA_SAVE; + goto _exit; + } + wAddr += ((index < 8) ? index : 8); + index -= 8; + } + // /*Release channel*/ + // pModbus_RTU_CB->pModbus_RTU->parentObj=NULL; + /*Received from the machine*/ + pModbus_RTU_CB->sendFlag = 2; + errRes = ERR_RW_FIN; + goto _exit; + } + case 0x3: /*Read holding register*/ + case 0x4: /*Read input register*/ + { + uint16 i; + uint16 len; + MD_RTU_LOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), + MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); + MDdeQueue(&(pModbus_RTU_CB->pModbus_RTU->mdSqQueue), &byte, UINT8_TYPE); + MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), + MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); + if ((byte + 2) != MDQueueLength(&(pModbus_RTU_CB->pModbus_RTU->mdSqQueue))) + { + /*Wrong length*/ + errRes = ERR_DATA_LEN; goto _exit; + } + len = byte >> 1; + for (i = 0; i < len; i++) + { + uint16 wTemp; + uint8 rByte; + MD_RTU_LOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), + MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); + MDdeQueue(&(pModbus_RTU_CB->pModbus_RTU->mdSqQueue), &rByte, UINT8_TYPE); + wTemp = (rByte << 8); + MDdeQueue(&(pModbus_RTU_CB->pModbus_RTU->mdSqQueue), &rByte, UINT8_TYPE); + wTemp |= rByte; + MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), + MD_RTU_LOCK_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); + if (!MDM_RTU_InsideWriteRegs(pModbus_RTU_CB->pModbus_RTU, startAddr + i, 1, &wTemp, 0, (AddrType)funCodeByte, slaveAddr)) + { + errRes = ERR_DATA_SAVE; + goto _exit; + } + } + pModbus_RTU_CB->sendFlag = 2; + errRes = ERR_RW_FIN; + goto _exit; + } + + case 0x5: /*Write single coil*/ + case 0x6: /*Write a single register*/ + { + uint16 res; + if (MDM_RTU_ReadUint16(pModbus_RTU_CB->pModbus_RTU, &res, 1) != ERR_NONE) + { + errRes = ERR_DATA_LEN; + goto _exit; + } + /*Return address mismatch error*/ + if (res != startAddr) + { + errRes = ERR_WRITE_COIL; + goto _exit; + } + if (MDM_RTU_ReadUint16(pModbus_RTU_CB->pModbus_RTU, &res, 1) != ERR_NONE) + { + errRes = ERR_DATA_LEN; + goto _exit; + } + /*Return data does not match*/ + if (res != *((uint16 *)wData)) + { + errRes = ERR_WRITE_COIL; + goto _exit; + } + pModbus_RTU_CB->sendFlag = 2; + errRes = ERR_RW_FIN; + goto _exit; + } + case 0x0F: /*Write multiple coils*/ + case 0x10: + { /*Write multiple registers*/ + uint16 res; + if (MDM_RTU_ReadUint16(pModbus_RTU_CB->pModbus_RTU, &res, 1) != ERR_NONE) + { + errRes = ERR_DATA_LEN; + goto _exit; + } + /*Return address mismatch error*/ + if (res != startAddr) + { + errRes = ERR_WRITE_COIL; + goto _exit; + } + if (MDM_RTU_ReadUint16(pModbus_RTU_CB->pModbus_RTU, &res, 1) != ERR_NONE) + { + errRes = ERR_DATA_LEN; + goto _exit; + } + /*Return data does not match*/ + if (res != numOf) + { + errRes = ERR_WRITE_COIL; + goto _exit; + } + pModbus_RTU_CB->sendFlag = 2; + errRes = ERR_RW_FIN; + goto _exit; + } + case 0x81: + pModbus_RTU_CB->sendFlag = 3; + errRes = ERR_READ_COIL; + goto _exit; /*Abnormal reading coil*/ + case 0x82: + pModbus_RTU_CB->sendFlag = 3; + errRes = ERR_READ_INPUT; + goto _exit; /*Read input discrete quantity abnormal*/ + case 0x83: + pModbus_RTU_CB->sendFlag = 3; + errRes = ERR_READ_HOLD_REG; + goto _exit; /*Read holding register error*/ + case 0x84: + pModbus_RTU_CB->sendFlag = 3; + errRes = ERR_READ_INPUT_REG; + goto _exit; /*Error reading input register*/ + case 0x85: + pModbus_RTU_CB->sendFlag = 3; + errRes = ERR_WRITE_COIL; + goto _exit; /*Write single coil error*/ + case 0x86: + pModbus_RTU_CB->sendFlag = 3; + errRes = ERR_WRITE_REG; + goto _exit; /*Error writing order*/ + case 0x8F: + pModbus_RTU_CB->sendFlag = 3; + errRes = ERR_WRITE_COIL; + goto _exit; /*Write multiple coil error*/ + case 0x90: + pModbus_RTU_CB->sendFlag = 3; + errRes = ERR_WRITE_REG; + goto _exit; /*Write multiple register error*/ } } - }else { + if (pModbus_RTU_CB->sendFlag == 2) + { /*If the sending is successful, send again*/ + /*Timing resend processing*/ + if (pModbus_RTU_CB->pModbus_RTU->timesTick - pModbus_RTU_CB->sendTimeTick >= pModbus_RTU_CB->sendIntervalTime) + { + /*Resend*/ + // MD_CLR_SENDED_FLAG(pModbus_RTU_CB); + pModbus_RTU_CB->sendFlag = 0; + // /*Release channel*/ + // pModbus_RTU_CB->pModbus_RTU->parentObj=NULL; + errRes = ERR_NONE; + goto _exit; + } + } + else if (pModbus_RTU_CB->sendFlag == 1 || pModbus_RTU_CB->sendFlag == 3) + { /*�Ѿ������ˣ����ǻ�û�յ���������ִ�г�ʱ���*/ + /*Receive timeout detection*/ + if (pModbus_RTU_CB->pModbus_RTU->timesTick - pModbus_RTU_CB->sendTimeTick >= pModbus_RTU_CB->sendOverTime) + { + /*Set the start point of timeout*/ + pModbus_RTU_CB->sendTimeTick = pModbus_RTU_CB->pModbus_RTU->timesTick; + /*Resend*/ + pModbus_RTU_CB->sendFlag = 0; + /*Increase the number of retransmissions by 1*/ + pModbus_RTU_CB->RTCount++; + + /*Release channel*/ + pModbus_RTU_CB->pModbus_RTU->parentObj = NULL; + + if (pModbus_RTU_CB->RTCount >= pModbus_RTU_CB->RTTimes) + { + /*The number of retransmissions exceeded*/ + errRes = ERR_RW_OV_TIME_ERR; + if (MD_CB_GET_DIS_FLAG_EN(pModbus_RTU_CB)) + { /*No polling when disconnected is enabled*/ + MD_CB_SET_DIS_FLAG(pModbus_RTU_CB); /*Device disconnection*/ + } + goto _exit; + } + /*Timed out*/ + errRes = ERR_OVER_TIME; + goto _exit; + } + } + } + else + { /*The number of retransmissions exceeded*/ - errRes= ERR_RW_OV_TIME_ERR; + errRes = ERR_RW_OV_TIME_ERR; goto _exit; } - if(pModbus_RTU_CB->sendFlag==1){/*If it has been sent, it will return the sending completion flag*/ - return ERR_SEND_FIN; + if (pModbus_RTU_CB->sendFlag == 1) + { /*If it has been sent, it will return the sending completion flag*/ + return ERR_SEND_FIN; } _exit: -// MD_CLR_SENDED_FLAG(pModbus_RTU_CB); -// if(errRes == ERR_RW_FIN){ -// pModbus_RTU_CB->RTCount=0; -// } + // MD_CLR_SENDED_FLAG(pModbus_RTU_CB); + // if(errRes == ERR_RW_FIN){ + // pModbus_RTU_CB->RTCount=0; + // } /*Release channel*/ - pModbus_RTU_CB->pModbus_RTU->parentObj=NULL; + pModbus_RTU_CB->pModbus_RTU->parentObj = NULL; return errRes; } /******************************************************* -* -* Function name :MDM_RTU_RW -* Description :Blocking read and write -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @funCode Function code, see [ModbusFunCode] -* @slaveAddr Slave address -* @startAddr Read and write start address -* @numOf Number of read and write data -* @wData If it is a write function code, then it is the written data -* Return : See [MDError] -**********************************************************/ + * + * Function name :MDM_RTU_RW + * Description :Blocking read and write + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @funCode Function code, see [ModbusFunCode] + * @slaveAddr Slave address + * @startAddr Read and write start address + * @numOf Number of read and write data + * @wData If it is a write function code, then it is the written data + * Return : See [MDError] + **********************************************************/ static MDError MDM_RTU_RW( PModbus_RTU_CB pModbus_RTU_CB, ModbusFunCode funCode, uint8 slaveAddr, uint16 startAddr, uint16 numOf, - void *wData -){ + void *wData) +{ MDError res; - void* tempObj; - if(pModbus_RTU_CB==NULL){ + void *tempObj; + if (pModbus_RTU_CB == NULL) + { return ERR_VOID; } - MD_RTU_LOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU),MD_RTU_LOCK_OBJ1_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); - tempObj=pModbus_RTU_CB->pModbus_RTU->parentObj; - pModbus_RTU_CB->pModbus_RTU->parentObj=NULL;/*Set to empty, so that non-blocking and blocking can be mixed calls*/ - do{ - res = MDM_RTU_NB_RW(pModbus_RTU_CB,funCode,slaveAddr,startAddr,numOf,wData); - if(res != ERR_RW_FIN){ /*An error occurred*/ - if(res == ERR_RW_OV_TIME_ERR){ /*Retransmission timed out*/ - MDM_RTU_CB_OverTimeReset(pModbus_RTU_CB);/*Enable retransmission*/ + MD_RTU_LOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), MD_RTU_LOCK_OBJ1_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); + tempObj = pModbus_RTU_CB->pModbus_RTU->parentObj; + pModbus_RTU_CB->pModbus_RTU->parentObj = NULL; /*Set to empty, so that non-blocking and blocking can be mixed calls*/ + do + { + res = MDM_RTU_NB_RW(pModbus_RTU_CB, funCode, slaveAddr, startAddr, numOf, wData); + if (res != ERR_RW_FIN) + { /*An error occurred*/ + if (res == ERR_RW_OV_TIME_ERR) + { /*Retransmission timed out*/ + MDM_RTU_CB_OverTimeReset(pModbus_RTU_CB); /*Enable retransmission*/ goto exit; - }else if(res==ERR_DEV_DIS){ + } + else if (res == ERR_DEV_DIS) + { goto exit; } } - #if MD_RTU_USED_OS +#if MD_RTU_USED_OS MD_RTU_Delay(5); - #endif - }while(res!=ERR_RW_FIN); - MDM_RTU_CB_OverTimeReset(pModbus_RTU_CB); - exit: - pModbus_RTU_CB->pModbus_RTU->parentObj=tempObj;/*Restore settings*/ - MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU),MD_RTU_LOCK_OBJ1_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); +#endif + } while (res != ERR_RW_FIN); + MDM_RTU_CB_OverTimeReset(pModbus_RTU_CB); +exit: + pModbus_RTU_CB->pModbus_RTU->parentObj = tempObj; /*Restore settings*/ + MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), MD_RTU_LOCK_OBJ1_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); return res; } /** -* Clear the RTU parameters. -*/ -void ModubusRTUClear(PModbus_RTU pOldModbus){ - pOldModbus->lastTimesTick=0xFFFFFFF; - pOldModbus->recvFlag=0; - pOldModbus->serialSendCount=0; - pOldModbus->mdSqQueue.rear=pOldModbus->mdSqQueue.front=0; + * Clear the RTU parameters. + */ +void ModubusRTUClear(PModbus_RTU pOldModbus) +{ + pOldModbus->lastTimesTick = 0xFFFFFFF; + pOldModbus->recvFlag = 0; + pOldModbus->serialSendCount = 0; + pOldModbus->mdSqQueue.rear = pOldModbus->mdSqQueue.front = 0; pOldModbus->mdSqQueue.valid = TRUE; } /******************************************************* -* -* Function name :MDM_RTU_RW_ex -* Description :Blocking read and write -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @funCode Function code, see [ModbusFunCode] -* @slaveAddr Slave address -* @startAddr Read and write start address -* @numOf Number of read and write data -* @wData If it is a write function code, then it is the written data -* Return : See [MDError] -**********************************************************/ + * + * Function name :MDM_RTU_RW_ex + * Description :Blocking read and write + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @funCode Function code, see [ModbusFunCode] + * @slaveAddr Slave address + * @startAddr Read and write start address + * @numOf Number of read and write data + * @wData If it is a write function code, then it is the written data + * Return : See [MDError] + **********************************************************/ static MDError MDM_RTU_RW_MIX( PModbus_RTU_CB pModbus_RTU_CB, ModbusFunCode funCode, uint8 slaveAddr, uint16 startAddr, uint16 numOf, - void *wData -){ + void *wData) +{ MDError res; - void* tempObj; - if(pModbus_RTU_CB==NULL){ + void *tempObj; + if (pModbus_RTU_CB == NULL) + { return ERR_VOID; } - MD_RTU_LOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU),MD_RTU_LOCK_OBJ1_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); - - tempObj=pModbus_RTU_CB->pModbus_RTU->parentObj; - pModbus_RTU_CB->pModbus_RTU->parentObj=NULL;/*Set to empty, so that non-blocking and blocking can be mixed calls*/ - if (pModbus_RTU_CB->pModbus_RTU->blockMode){ + MD_RTU_LOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), MD_RTU_LOCK_OBJ1_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); + + tempObj = pModbus_RTU_CB->pModbus_RTU->parentObj; + pModbus_RTU_CB->pModbus_RTU->parentObj = NULL; /*Set to empty, so that non-blocking and blocking can be mixed calls*/ + if (pModbus_RTU_CB->pModbus_RTU->blockMode) + { /* - * Last time in non-blocking mode. - * If the mode was previously non-blocking, all states need to - * be cleared and a delay may be required, - * as data may have been sent previously. - */ + * Last time in non-blocking mode. + * If the mode was previously non-blocking, all states need to + * be cleared and a delay may be required, + * as data may have been sent previously. + */ ModubusRTUClear(pModbus_RTU_CB->pModbus_RTU); - MDM_RTU_CB_OverTimeReset(pModbus_RTU_CB); + MDM_RTU_CB_OverTimeReset(pModbus_RTU_CB); MD_RTU_Delay(MDM_MIX_CALL_DELAY); } - pModbus_RTU_CB->pModbus_RTU->blockMode=0;/*Currently in blocking mode*/ - do{ - res = MDM_RTU_NB_RW(pModbus_RTU_CB,funCode,slaveAddr,startAddr,numOf,wData); - if(res != ERR_RW_FIN){ /*An error occurred*/ - if(res == ERR_RW_OV_TIME_ERR){ /*Retransmission timed out*/ - MDM_RTU_CB_OverTimeReset(pModbus_RTU_CB);/*Enable retransmission*/ + pModbus_RTU_CB->pModbus_RTU->blockMode = 0; /*Currently in blocking mode*/ + do + { + res = MDM_RTU_NB_RW(pModbus_RTU_CB, funCode, slaveAddr, startAddr, numOf, wData); + if (res != ERR_RW_FIN) + { /*An error occurred*/ + if (res == ERR_RW_OV_TIME_ERR) + { /*Retransmission timed out*/ + MDM_RTU_CB_OverTimeReset(pModbus_RTU_CB); /*Enable retransmission*/ goto exit; - }else if(res==ERR_DEV_DIS){ + } + else if (res == ERR_DEV_DIS) + { goto exit; } } - #if MD_RTU_USED_OS +#if MD_RTU_USED_OS MD_RTU_Delay(5); - #endif - }while(res!=ERR_RW_FIN); - MDM_RTU_CB_OverTimeReset(pModbus_RTU_CB); - exit: +#endif + } while (res != ERR_RW_FIN); + MDM_RTU_CB_OverTimeReset(pModbus_RTU_CB); +exit: ModubusRTUClear(pModbus_RTU_CB->pModbus_RTU); - pModbus_RTU_CB->pModbus_RTU->parentObj=tempObj;/*Restore settings*/ - MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU),MD_RTU_LOCK_OBJ1_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); + pModbus_RTU_CB->pModbus_RTU->parentObj = tempObj; /*Restore settings*/ + MD_RTU_UNLOCK((PModbusBase)(pModbus_RTU_CB->pModbus_RTU), MD_RTU_LOCK_OBJ1_HANDLE_ARG((pModbus_RTU_CB->pModbus_RTU))); return res; } /******************************************************* -* -* Function name :MDM_RTU_ReadCoil -* Description :Read coil -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @slaveAddr Slave address -* @startAddr Read start address -* @numOf Number of read data -* Return : See [MDError] -**********************************************************/ -MDError MDM_RTU_ReadCoil(PModbus_RTU_CB pModbus_RTU_CB,uint8 slaveAddr,uint16 startAddr,uint16 numOf){ - return MDM_RTU_RW(pModbus_RTU_CB,READ_COIL,slaveAddr,startAddr,numOf,NULL); + * + * Function name :MDM_RTU_ReadCoil + * Description :Read coil + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @slaveAddr Slave address + * @startAddr Read start address + * @numOf Number of read data + * Return : See [MDError] + **********************************************************/ +MDError MDM_RTU_ReadCoil(PModbus_RTU_CB pModbus_RTU_CB, uint8 slaveAddr, uint16 startAddr, uint16 numOf) +{ + return MDM_RTU_RW(pModbus_RTU_CB, READ_COIL, slaveAddr, startAddr, numOf, NULL); } /******************************************************* -* -* Function name :MDM_RTU_ReadInput -* Description :Read input -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @slaveAddr Slave address -* @startAddr Read start address -* @numOf Number of read data -* Return : See [MDError] -**********************************************************/ -MDError MDM_RTU_ReadInput(PModbus_RTU_CB pModbus_RTU_CB,uint8 slaveAddr,uint16 startAddr,uint16 numOf){ - return MDM_RTU_RW(pModbus_RTU_CB,READ_INPUT,slaveAddr,startAddr,numOf,NULL); + * + * Function name :MDM_RTU_ReadInput + * Description :Read input + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @slaveAddr Slave address + * @startAddr Read start address + * @numOf Number of read data + * Return : See [MDError] + **********************************************************/ +MDError MDM_RTU_ReadInput(PModbus_RTU_CB pModbus_RTU_CB, uint8 slaveAddr, uint16 startAddr, uint16 numOf) +{ + return MDM_RTU_RW(pModbus_RTU_CB, READ_INPUT, slaveAddr, startAddr, numOf, NULL); } /******************************************************* -* -* Function name :MDM_RTU_ReadHoldReg -* Description :Read holding register -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @slaveAddr Slave address -* @startAddr Read start address -* @numOf Number of read data -* Return : See [MDError] -**********************************************************/ -MDError MDM_RTU_ReadHoldReg(PModbus_RTU_CB pModbus_RTU_CB,uint8 slaveAddr,uint16 startAddr,uint16 numOf){ - return MDM_RTU_RW(pModbus_RTU_CB,READ_HOLD_REG,slaveAddr,startAddr,numOf,NULL); + * + * Function name :MDM_RTU_ReadHoldReg + * Description :Read holding register + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @slaveAddr Slave address + * @startAddr Read start address + * @numOf Number of read data + * Return : See [MDError] + **********************************************************/ +MDError MDM_RTU_ReadHoldReg(PModbus_RTU_CB pModbus_RTU_CB, uint8 slaveAddr, uint16 startAddr, uint16 numOf) +{ + return MDM_RTU_RW(pModbus_RTU_CB, READ_HOLD_REG, slaveAddr, startAddr, numOf, NULL); } /******************************************************* -* -* Function name :MDM_RTU_ReadInputReg -* Description :Read input register -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @slaveAddr Slave address -* @startAddr Read start address -* @numOf Number of read data -* Return : See [MDError] -**********************************************************/ -MDError MDM_RTU_ReadInputReg(PModbus_RTU_CB pModbus_RTU_CB,uint8 slaveAddr,uint16 startAddr,uint16 numOf){ - return MDM_RTU_RW(pModbus_RTU_CB,READ_INPUT_REG,slaveAddr,startAddr,numOf,NULL); + * + * Function name :MDM_RTU_ReadInputReg + * Description :Read input register + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @slaveAddr Slave address + * @startAddr Read start address + * @numOf Number of read data + * Return : See [MDError] + **********************************************************/ +MDError MDM_RTU_ReadInputReg(PModbus_RTU_CB pModbus_RTU_CB, uint8 slaveAddr, uint16 startAddr, uint16 numOf) +{ + return MDM_RTU_RW(pModbus_RTU_CB, READ_INPUT_REG, slaveAddr, startAddr, numOf, NULL); } /******************************************************* -* -* Function name :MDM_RTU_WriteSingleCoil -* Description :Write a single coil -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @slaveAddr Slave address -* @startAddr Read start address -* @boolVal TRUE , FALSE -* Return : See [MDError] -**********************************************************/ + * + * Function name :MDM_RTU_WriteSingleCoil + * Description :Write a single coil + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @slaveAddr Slave address + * @startAddr Read start address + * @boolVal TRUE , FALSE + * Return : See [MDError] + **********************************************************/ MDError MDM_RTU_WriteSingleCoil( - PModbus_RTU_CB pModbus_RTU_CB,uint8 slaveAddr,uint16 startAddr,BOOL boolVal){ + PModbus_RTU_CB pModbus_RTU_CB, uint8 slaveAddr, uint16 startAddr, BOOL boolVal) +{ uint16 temp; - temp=boolVal?0xFF00:0x0000; - return MDM_RTU_RW(pModbus_RTU_CB,WRITE_SIN_COIL,slaveAddr,startAddr,1,(void*)(&temp)); + temp = boolVal ? 0xFF00 : 0x0000; + return MDM_RTU_RW(pModbus_RTU_CB, WRITE_SIN_COIL, slaveAddr, startAddr, 1, (void *)(&temp)); } /******************************************************* -* -* Function name :MDM_RTU_WriteSingleReg -* Description :Write a single register -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @slaveAddr Slave address -* @startAddr Read start address -* @boolVal TRUE , FALSE -* Return : See [MDError] -**********************************************************/ + * + * Function name :MDM_RTU_WriteSingleReg + * Description :Write a single register + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @slaveAddr Slave address + * @startAddr Read start address + * @boolVal TRUE , FALSE + * Return : See [MDError] + **********************************************************/ MDError MDM_RTU_WriteSingleReg( - PModbus_RTU_CB pModbus_RTU_CB,uint8 slaveAddr,uint16 startAddr,uint16 val){ - return MDM_RTU_RW(pModbus_RTU_CB,WRITE_SIN_REG,slaveAddr,startAddr,1,(void*)(&val)); + PModbus_RTU_CB pModbus_RTU_CB, uint8 slaveAddr, uint16 startAddr, uint16 val) +{ + return MDM_RTU_RW(pModbus_RTU_CB, WRITE_SIN_REG, slaveAddr, startAddr, 1, (void *)(&val)); } /******************************************************* -* -* Function name :MDM_RTU_WriteCoils -* Description :Write coil -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @slaveAddr Slave address -* @startAddr Read start address -* @numOf Number of write data -* @boolVal TRUE , FALSE -* Return : See [MDError] -**********************************************************/ + * + * Function name :MDM_RTU_WriteCoils + * Description :Write coil + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @slaveAddr Slave address + * @startAddr Read start address + * @numOf Number of write data + * @boolVal TRUE , FALSE + * Return : See [MDError] + **********************************************************/ MDError MDM_RTU_WriteCoils( - PModbus_RTU_CB pModbus_RTU_CB,uint8 slaveAddr,uint16 startAddr,uint16 numOf,uint8* val){ - return MDM_RTU_RW(pModbus_RTU_CB,WRITE_COILS,slaveAddr,startAddr,numOf,(void*)(val)); + PModbus_RTU_CB pModbus_RTU_CB, uint8 slaveAddr, uint16 startAddr, uint16 numOf, uint8 *val) +{ + return MDM_RTU_RW(pModbus_RTU_CB, WRITE_COILS, slaveAddr, startAddr, numOf, (void *)(val)); } /******************************************************* -* -* Function name :MDM_RTU_WriteRegs -* Description :Write register -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @slaveAddr Slave address -* @startAddr Read start address -* @numOf Number of write data -* @boolVal TRUE , FALSE -* Return : See [MDError] -**********************************************************/ + * + * Function name :MDM_RTU_WriteRegs + * Description :Write register + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @slaveAddr Slave address + * @startAddr Read start address + * @numOf Number of write data + * @boolVal TRUE , FALSE + * Return : See [MDError] + **********************************************************/ MDError MDM_RTU_WriteRegs( - PModbus_RTU_CB pModbus_RTU_CB,uint8 slaveAddr,uint16 startAddr,uint16 numOf,uint16* val){ - return MDM_RTU_RW(pModbus_RTU_CB,WRITE_REGS,slaveAddr,startAddr,numOf,(void*)(val)); + PModbus_RTU_CB pModbus_RTU_CB, uint8 slaveAddr, uint16 startAddr, uint16 numOf, uint16 *val) +{ + return MDM_RTU_RW(pModbus_RTU_CB, WRITE_REGS, slaveAddr, startAddr, numOf, (void *)(val)); } - /******************************************************* -* -* Function name :MDM_RTU_MixReadCoil -* Description :Read coil -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @slaveAddr Slave address -* @startAddr Read start address -* @numOf Number of read data -* Return : See [MDError] -**********************************************************/ -MDError MDM_RTU_MixReadCoil(PModbus_RTU_CB pModbus_RTU_CB,uint8 slaveAddr,uint16 startAddr,uint16 numOf){ - return MDM_RTU_RW_MIX(pModbus_RTU_CB,READ_COIL,slaveAddr,startAddr,numOf,NULL); + * + * Function name :MDM_RTU_MixReadCoil + * Description :Read coil + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @slaveAddr Slave address + * @startAddr Read start address + * @numOf Number of read data + * Return : See [MDError] + **********************************************************/ +MDError MDM_RTU_MixReadCoil(PModbus_RTU_CB pModbus_RTU_CB, uint8 slaveAddr, uint16 startAddr, uint16 numOf) +{ + return MDM_RTU_RW_MIX(pModbus_RTU_CB, READ_COIL, slaveAddr, startAddr, numOf, NULL); } /******************************************************* -* -* Function name :MDM_RTU_MixReadInput -* Description :Read input -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @slaveAddr Slave address -* @startAddr Read start address -* @numOf Number of read data -* Return : See [MDError] -**********************************************************/ -MDError MDM_RTU_MixReadInput(PModbus_RTU_CB pModbus_RTU_CB,uint8 slaveAddr,uint16 startAddr,uint16 numOf){ - return MDM_RTU_RW_MIX(pModbus_RTU_CB,READ_INPUT,slaveAddr,startAddr,numOf,NULL); + * + * Function name :MDM_RTU_MixReadInput + * Description :Read input + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @slaveAddr Slave address + * @startAddr Read start address + * @numOf Number of read data + * Return : See [MDError] + **********************************************************/ +MDError MDM_RTU_MixReadInput(PModbus_RTU_CB pModbus_RTU_CB, uint8 slaveAddr, uint16 startAddr, uint16 numOf) +{ + return MDM_RTU_RW_MIX(pModbus_RTU_CB, READ_INPUT, slaveAddr, startAddr, numOf, NULL); } /******************************************************* -* -* Function name :MDM_RTU_MixReadHoldReg -* Description :Read holding register -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @slaveAddr Slave address -* @startAddr Read start address -* @numOf Number of read data -* Return : See [MDError] -**********************************************************/ -MDError MDM_RTU_MixReadHoldReg(PModbus_RTU_CB pModbus_RTU_CB,uint8 slaveAddr,uint16 startAddr,uint16 numOf){ - return MDM_RTU_RW_MIX(pModbus_RTU_CB,READ_HOLD_REG,slaveAddr,startAddr,numOf,NULL); + * + * Function name :MDM_RTU_MixReadHoldReg + * Description :Read holding register + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @slaveAddr Slave address + * @startAddr Read start address + * @numOf Number of read data + * Return : See [MDError] + **********************************************************/ +MDError MDM_RTU_MixReadHoldReg(PModbus_RTU_CB pModbus_RTU_CB, uint8 slaveAddr, uint16 startAddr, uint16 numOf) +{ + return MDM_RTU_RW_MIX(pModbus_RTU_CB, READ_HOLD_REG, slaveAddr, startAddr, numOf, NULL); } /******************************************************* -* -* Function name :MDM_RTU_MixReadInputReg -* Description :Read input register -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @slaveAddr Slave address -* @startAddr Read start address -* @numOf Number of read data -* Return : See [MDError] -**********************************************************/ -MDError MDM_RTU_MixReadInputReg(PModbus_RTU_CB pModbus_RTU_CB,uint8 slaveAddr,uint16 startAddr,uint16 numOf){ - return MDM_RTU_RW_MIX(pModbus_RTU_CB,READ_INPUT_REG,slaveAddr,startAddr,numOf,NULL); + * + * Function name :MDM_RTU_MixReadInputReg + * Description :Read input register + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @slaveAddr Slave address + * @startAddr Read start address + * @numOf Number of read data + * Return : See [MDError] + **********************************************************/ +MDError MDM_RTU_MixReadInputReg(PModbus_RTU_CB pModbus_RTU_CB, uint8 slaveAddr, uint16 startAddr, uint16 numOf) +{ + return MDM_RTU_RW_MIX(pModbus_RTU_CB, READ_INPUT_REG, slaveAddr, startAddr, numOf, NULL); } /******************************************************* -* -* Function name :MDM_RTU_MixWriteSingleCoil -* Description :Write a single coil -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @slaveAddr Slave address -* @startAddr Read start address -* @boolVal TRUE , FALSE -* Return : See [MDError] -**********************************************************/ + * + * Function name :MDM_RTU_MixWriteSingleCoil + * Description :Write a single coil + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @slaveAddr Slave address + * @startAddr Read start address + * @boolVal TRUE , FALSE + * Return : See [MDError] + **********************************************************/ MDError MDM_RTU_MixWriteSingleCoil( - PModbus_RTU_CB pModbus_RTU_CB,uint8 slaveAddr,uint16 startAddr,BOOL boolVal){ + PModbus_RTU_CB pModbus_RTU_CB, uint8 slaveAddr, uint16 startAddr, BOOL boolVal) +{ uint16 temp; - temp=boolVal?0xFF00:0x0000; - return MDM_RTU_RW_MIX(pModbus_RTU_CB,WRITE_SIN_COIL,slaveAddr,startAddr,1,(void*)(&temp)); + temp = boolVal ? 0xFF00 : 0x0000; + return MDM_RTU_RW_MIX(pModbus_RTU_CB, WRITE_SIN_COIL, slaveAddr, startAddr, 1, (void *)(&temp)); } /******************************************************* -* -* Function name :MDM_RTU_MixWriteSingleReg -* Description :Write a single register -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @slaveAddr Slave address -* @startAddr Read start address -* @boolVal TRUE , FALSE -* Return : See [MDError] -**********************************************************/ + * + * Function name :MDM_RTU_MixWriteSingleReg + * Description :Write a single register + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @slaveAddr Slave address + * @startAddr Read start address + * @boolVal TRUE , FALSE + * Return : See [MDError] + **********************************************************/ MDError MDM_RTU_MixWriteSingleReg( - PModbus_RTU_CB pModbus_RTU_CB,uint8 slaveAddr,uint16 startAddr,uint16 val){ - return MDM_RTU_RW_MIX(pModbus_RTU_CB,WRITE_SIN_REG - ,slaveAddr,startAddr,1,(void*)(&val)); + PModbus_RTU_CB pModbus_RTU_CB, uint8 slaveAddr, uint16 startAddr, uint16 val) +{ + return MDM_RTU_RW_MIX(pModbus_RTU_CB, WRITE_SIN_REG, slaveAddr, startAddr, 1, (void *)(&val)); } /******************************************************* -* -* Function name :MDM_RTU_MixWriteCoils -* Description :Write coil -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @slaveAddr Slave address -* @startAddr Read start address -* @numOf Number of write data -* @boolVal TRUE , FALSE -* Return : See [MDError] -**********************************************************/ + * + * Function name :MDM_RTU_MixWriteCoils + * Description :Write coil + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @slaveAddr Slave address + * @startAddr Read start address + * @numOf Number of write data + * @boolVal TRUE , FALSE + * Return : See [MDError] + **********************************************************/ MDError MDM_RTU_MixWriteCoils( - PModbus_RTU_CB pModbus_RTU_CB,uint8 slaveAddr,uint16 startAddr,uint16 numOf,uint8* val){ - return MDM_RTU_RW_MIX(pModbus_RTU_CB,WRITE_COILS,slaveAddr,startAddr,numOf,(void*)(val)); + PModbus_RTU_CB pModbus_RTU_CB, uint8 slaveAddr, uint16 startAddr, uint16 numOf, uint8 *val) +{ + return MDM_RTU_RW_MIX(pModbus_RTU_CB, WRITE_COILS, slaveAddr, startAddr, numOf, (void *)(val)); } /******************************************************* -* -* Function name :MDM_RTU_MixWriteRegs -* Description :Write register -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @slaveAddr Slave address -* @startAddr Read start address -* @numOf Number of write data -* @boolVal TRUE , FALSE -* Return : See [MDError] -**********************************************************/ + * + * Function name :MDM_RTU_MixWriteRegs + * Description :Write register + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @slaveAddr Slave address + * @startAddr Read start address + * @numOf Number of write data + * @boolVal TRUE , FALSE + * Return : See [MDError] + **********************************************************/ MDError MDM_RTU_MixWriteRegs( - PModbus_RTU_CB pModbus_RTU_CB,uint8 slaveAddr,uint16 startAddr,uint16 numOf,uint16* val){ - return MDM_RTU_RW_MIX(pModbus_RTU_CB,WRITE_REGS,slaveAddr,startAddr,numOf,(void*)(val)); + PModbus_RTU_CB pModbus_RTU_CB, uint8 slaveAddr, uint16 startAddr, uint16 numOf, uint16 *val) +{ + return MDM_RTU_RW_MIX(pModbus_RTU_CB, WRITE_REGS, slaveAddr, startAddr, numOf, (void *)(val)); } /******************************************************* -* -* Function name :MDM_RTU_ReadCoil -* Description :Non-blocking read coil -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @slaveAddr Slave address -* @startAddr Read start address -* @numOf Number of read data -* Return : See [MDError] -**********************************************************/ -MDError MDM_RTU_NB_ReadCoil(PModbus_RTU_CB pModbus_RTU_CB,uint8 slaveAddr,uint16 startAddr,uint16 numOf){ - return MDM_RTU_NB_RW(pModbus_RTU_CB,READ_COIL,slaveAddr,startAddr,numOf,NULL); + * + * Function name :MDM_RTU_ReadCoil + * Description :Non-blocking read coil + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @slaveAddr Slave address + * @startAddr Read start address + * @numOf Number of read data + * Return : See [MDError] + **********************************************************/ +MDError MDM_RTU_NB_ReadCoil(PModbus_RTU_CB pModbus_RTU_CB, uint8 slaveAddr, uint16 startAddr, uint16 numOf) +{ + return MDM_RTU_NB_RW(pModbus_RTU_CB, READ_COIL, slaveAddr, startAddr, numOf, NULL); } /******************************************************* -* -* Function name :MDM_RTU_ReadInput -* Description :Non-blocking read input -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @slaveAddr Slave address -* @startAddr Read start address -* @numOf Number of read data -* Return : See [MDError] -**********************************************************/ -MDError MDM_RTU_NB_ReadInput(PModbus_RTU_CB pModbus_RTU_CB,uint8 slaveAddr,uint16 startAddr,uint16 numOf){ - return MDM_RTU_NB_RW(pModbus_RTU_CB,READ_INPUT,slaveAddr,startAddr,numOf,NULL); + * + * Function name :MDM_RTU_ReadInput + * Description :Non-blocking read input + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @slaveAddr Slave address + * @startAddr Read start address + * @numOf Number of read data + * Return : See [MDError] + **********************************************************/ +MDError MDM_RTU_NB_ReadInput(PModbus_RTU_CB pModbus_RTU_CB, uint8 slaveAddr, uint16 startAddr, uint16 numOf) +{ + return MDM_RTU_NB_RW(pModbus_RTU_CB, READ_INPUT, slaveAddr, startAddr, numOf, NULL); } /******************************************************* -* -* Function name :MDM_RTU_ReadHoldReg -* Description :Non-blocking read holding register -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @slaveAddr Slave address -* @startAddr Read start address -* @numOf Number of read data -* Return : See [MDError] -**********************************************************/ -MDError MDM_RTU_NB_ReadHoldReg(PModbus_RTU_CB pModbus_RTU_CB,uint8 slaveAddr,uint16 startAddr,uint16 numOf){ - return MDM_RTU_NB_RW(pModbus_RTU_CB,READ_HOLD_REG,slaveAddr,startAddr,numOf,NULL); + * + * Function name :MDM_RTU_ReadHoldReg + * Description :Non-blocking read holding register + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @slaveAddr Slave address + * @startAddr Read start address + * @numOf Number of read data + * Return : See [MDError] + **********************************************************/ +MDError MDM_RTU_NB_ReadHoldReg(PModbus_RTU_CB pModbus_RTU_CB, uint8 slaveAddr, uint16 startAddr, uint16 numOf) +{ + return MDM_RTU_NB_RW(pModbus_RTU_CB, READ_HOLD_REG, slaveAddr, startAddr, numOf, NULL); } /******************************************************* -* -* Function name :MDM_RTU_ReadHoldReg -* Description :Non-blocking read input register -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @slaveAddr Slave address -* @startAddr Read start address -* @numOf Number of read data -* Return : See [MDError] -**********************************************************/ -MDError MDM_RTU_NB_ReadInputReg(PModbus_RTU_CB pModbus_RTU_CB,uint8 slaveAddr,uint16 startAddr,uint16 numOf){ - return MDM_RTU_NB_RW(pModbus_RTU_CB,READ_INPUT_REG,slaveAddr,startAddr,numOf,NULL); + * + * Function name :MDM_RTU_ReadHoldReg + * Description :Non-blocking read input register + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @slaveAddr Slave address + * @startAddr Read start address + * @numOf Number of read data + * Return : See [MDError] + **********************************************************/ +MDError MDM_RTU_NB_ReadInputReg(PModbus_RTU_CB pModbus_RTU_CB, uint8 slaveAddr, uint16 startAddr, uint16 numOf) +{ + return MDM_RTU_NB_RW(pModbus_RTU_CB, READ_INPUT_REG, slaveAddr, startAddr, numOf, NULL); } /******************************************************* -* -* Function name :MDM_RTU_WriteSingleCoil -* Description :Non-blocking write single coil -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @slaveAddr Slave address -* @startAddr Read start address -* @boolVal TRUE , FALSE -* Return : See [MDError] -**********************************************************/ + * + * Function name :MDM_RTU_WriteSingleCoil + * Description :Non-blocking write single coil + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @slaveAddr Slave address + * @startAddr Read start address + * @boolVal TRUE , FALSE + * Return : See [MDError] + **********************************************************/ MDError MDM_RTU_NB_WriteSingleCoil( - PModbus_RTU_CB pModbus_RTU_CB,uint8 slaveAddr,uint16 startAddr,BOOL boolVal){ + PModbus_RTU_CB pModbus_RTU_CB, uint8 slaveAddr, uint16 startAddr, BOOL boolVal) +{ uint16 temp; - temp=boolVal?0xFF00:0x0000; - return MDM_RTU_NB_RW(pModbus_RTU_CB,WRITE_SIN_COIL,slaveAddr,startAddr,1,(void*)(&temp)); + temp = boolVal ? 0xFF00 : 0x0000; + return MDM_RTU_NB_RW(pModbus_RTU_CB, WRITE_SIN_COIL, slaveAddr, startAddr, 1, (void *)(&temp)); } /******************************************************* -* -* Function name :MDM_RTU_WriteSingleReg -* Description :Non-blocking write to a single register -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @slaveAddr Slave address -* @startAddr Read start address -* @boolVal TRUE , FALSE -* Return : See [MDError] -**********************************************************/ + * + * Function name :MDM_RTU_WriteSingleReg + * Description :Non-blocking write to a single register + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @slaveAddr Slave address + * @startAddr Read start address + * @boolVal TRUE , FALSE + * Return : See [MDError] + **********************************************************/ MDError MDM_RTU_NB_WriteSingleReg( - PModbus_RTU_CB pModbus_RTU_CB,uint8 slaveAddr,uint16 startAddr,uint16 val){ - return MDM_RTU_NB_RW(pModbus_RTU_CB,WRITE_SIN_REG,slaveAddr,startAddr,1,(void*)(&val)); + PModbus_RTU_CB pModbus_RTU_CB, uint8 slaveAddr, uint16 startAddr, uint16 val) +{ + return MDM_RTU_NB_RW(pModbus_RTU_CB, WRITE_SIN_REG, slaveAddr, startAddr, 1, (void *)(&val)); } /******************************************************* -* -* Function name :MDM_RTU_WriteCoils -* Description :Non-blocking write coil -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @slaveAddr Slave address -* @startAddr Read start address -* @numOf Number of write data -* @boolVal TRUE , FALSE -* Return : See [MDError] -**********************************************************/ + * + * Function name :MDM_RTU_WriteCoils + * Description :Non-blocking write coil + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @slaveAddr Slave address + * @startAddr Read start address + * @numOf Number of write data + * @boolVal TRUE , FALSE + * Return : See [MDError] + **********************************************************/ MDError MDM_RTU_NB_WriteCoils( - PModbus_RTU_CB pModbus_RTU_CB,uint8 slaveAddr,uint16 startAddr,uint16 numOf,uint8* val){ - return MDM_RTU_NB_RW(pModbus_RTU_CB,WRITE_COILS,slaveAddr,startAddr,numOf,(void*)(val)); + PModbus_RTU_CB pModbus_RTU_CB, uint8 slaveAddr, uint16 startAddr, uint16 numOf, uint8 *val) +{ + return MDM_RTU_NB_RW(pModbus_RTU_CB, WRITE_COILS, slaveAddr, startAddr, numOf, (void *)(val)); } /******************************************************* -* -* Function name :MDM_RTU_WriteRegs -* Description :Non-blocking write register -* Parameter : -* @pModbus_RTU_CB Write control block object pointer -* @slaveAddr Slave address -* @startAddr Read start address -* @numOf Number of write data -* @boolVal TRUE , FALSE -* Return : See [MDError] -**********************************************************/ + * + * Function name :MDM_RTU_WriteRegs + * Description :Non-blocking write register + * Parameter : + * @pModbus_RTU_CB Write control block object pointer + * @slaveAddr Slave address + * @startAddr Read start address + * @numOf Number of write data + * @boolVal TRUE , FALSE + * Return : See [MDError] + **********************************************************/ MDError MDM_RTU_NB_WriteRegs( - PModbus_RTU_CB pModbus_RTU_CB,uint8 slaveAddr,uint16 startAddr,uint16 numOf,uint16* val){ - return MDM_RTU_NB_RW(pModbus_RTU_CB,WRITE_REGS,slaveAddr,startAddr,numOf,(void*)(val)); + PModbus_RTU_CB pModbus_RTU_CB, uint8 slaveAddr, uint16 startAddr, uint16 numOf, uint16 *val) +{ + return MDM_RTU_NB_RW(pModbus_RTU_CB, WRITE_REGS, slaveAddr, startAddr, numOf, (void *)(val)); } - diff --git a/mkrtos_user/lib/sys/inc/u_types.h b/mkrtos_user/lib/sys/inc/u_types.h index 3e5eab8bd..c901a75a6 100755 --- a/mkrtos_user/lib/sys/inc/u_types.h +++ b/mkrtos_user/lib/sys/inc/u_types.h @@ -28,7 +28,7 @@ typedef union mk_sd }; } mk_sd_t; #define mk_sd_init_raw(val) ((mk_sd_t){.raw = val}) -#define mk_sd_init3(h, f) ((mk_sd_t){.hd = h, .fd = f}) +#define mk_sd_init2(h, f) ((mk_sd_t){.hd = h, .fd = f}) #define mk_sd_get_hd(sd) ((obj_handler_t)((sd).hd)) #define mk_sd_get_fd(sd) ((int)((sd).fd)) diff --git a/mkrtos_user/lib/sys_svr/src/fs_cli.c b/mkrtos_user/lib/sys_svr/src/fs_cli.c index 1c4f9153e..4752770ca 100644 --- a/mkrtos_user/lib/sys_svr/src/fs_cli.c +++ b/mkrtos_user/lib/sys_svr/src/fs_cli.c @@ -42,8 +42,8 @@ sd_t fs_open(const char *path, int flags, int mode) } rpc_ref_array_uint32_t_uint8_t_32_t rpc_path = { - .data = path, - .len = strlen(path) + 1, + .data = &path[ret], + .len = strlen(&path[ret]) + 1, }; rpc_int_t rpc_flags = { .data = flags, @@ -58,7 +58,7 @@ sd_t fs_open(const char *path, int flags, int mode) return msg_tag_get_val(tag); } - return msg_tag_get_val(tag); + return mk_sd_init2(hd, msg_tag_get_val(tag)).raw; } int fs_read(sd_t _fd, void *buf, size_t len) { @@ -154,7 +154,7 @@ int fs_close(sd_t _fd) int fs_lseek(sd_t _fd, int offs, int whence) { obj_handler_t hd = mk_sd_init_raw(_fd).hd; - int fd =mk_sd_init_raw(_fd).fd; + int fd = mk_sd_init_raw(_fd).fd; rpc_int_t rpc_fd = { .data = fd, diff --git a/mkrtos_user/lib/sys_svr/src/ns_cli.c b/mkrtos_user/lib/sys_svr/src/ns_cli.c index 2779d7ffa..a151132a8 100644 --- a/mkrtos_user/lib/sys_svr/src/ns_cli.c +++ b/mkrtos_user/lib/sys_svr/src/ns_cli.c @@ -38,12 +38,12 @@ static obj_handler_t find_hd(const char *path, int *split_pos) { if (ns_cli_cache.cache[i].path[0] != 0) { - char *new_str = strstr(ns_cli_cache.cache[i].path, path); - if (new_str && (new_str == ns_cli_cache.cache[i].path)) + char *new_str = strstr(path, ns_cli_cache.cache[i].path); + if (new_str && (new_str == path)) { if (split_pos) { - *split_pos = (int)(new_str - ns_cli_cache.cache[i].path); + *split_pos = (int)(strlen(ns_cli_cache.cache[i].path)); } return ns_cli_cache.cache[i].hd; } @@ -51,7 +51,7 @@ static obj_handler_t find_hd(const char *path, int *split_pos) } return HANDLER_INVALID; } -static bool_t reg_hd(const char *path, obj_handler_t hd) +static bool_t reg_hd(const char *path, obj_handler_t hd, int split_inx) { int i = 0; int empty = -1; @@ -59,7 +59,8 @@ static bool_t reg_hd(const char *path, obj_handler_t hd) { if (ns_cli_cache.cache[i].path[0] == 0) { - strcpy(ns_cli_cache.cache[i].path, path); + strncpy(ns_cli_cache.cache[i].path, path, split_inx); + ns_cli_cache.cache[i].path[split_inx] = 0; ns_cli_cache.cache[i].hd = hd; return TRUE; } @@ -103,7 +104,7 @@ int ns_query(const char *path, obj_handler_t *svr_hd) if (newfd != HANDLER_INVALID) { *svr_hd = newfd; - return 0; + return inx; } newfd = handler_alloc(); @@ -114,8 +115,8 @@ int ns_query(const char *path, obj_handler_t *svr_hd) } rpc_ref_array_uint32_t_uint8_t_32_t rpc_path = { - .data = &path[inx], - .len = strlen(&path[inx]) + 1, + .data = path, + .len = strlen(path) + 1, }; rpc_obj_handler_t_t rpc_svr_hd = { .data = newfd, @@ -129,7 +130,7 @@ int ns_query(const char *path, obj_handler_t *svr_hd) handler_free(newfd); return msg_tag_get_val(tag); } - if (reg_hd(path, newfd) == FALSE) + if (reg_hd(path, newfd, msg_tag_get_val(tag)) == FALSE) { printf("The client service cache is full.\n"); handler_free_umap(newfd); diff --git a/mkrtos_user/lib/sys_svr/src/ns_svr.c b/mkrtos_user/lib/sys_svr/src/ns_svr.c index 0d8632b06..dd517d8f4 100644 --- a/mkrtos_user/lib/sys_svr/src/ns_svr.c +++ b/mkrtos_user/lib/sys_svr/src/ns_svr.c @@ -46,124 +46,9 @@ RPC_GENERATION_OP2(ns_t, NS_QUERY_OP, query, return ret; } -// RPC_GENERATION_DISPATCH2(ns_t, NS_QUERY_OP, query, -// rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, path, -// rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_INOUT, RPC_TYPE_BUF, cli_hd) -msg_tag_t ns_t_query_dispatch(ns_t *obj, msg_tag_t tag, ipc_msg_t *ipc_msg) -{ - rpc_array_uint32_t_uint8_t_32_t var0; - rpc_obj_handler_t_t var1; - size_t op_val; - uint8_t *value = (uint8_t *)(ipc_msg->msg_buf); - int off = 0; - rpc_var_rpc_array_uint32_t_uint8_t_32_t_init(&var0); - rpc_var_rpc_obj_handler_t_t_init(&var1); - op_val = *((typeof(((uint16_t)1)) *)value); - if (op_val != ((uint16_t)1)) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (-100)}); - } - off += sizeof(typeof(((uint16_t)1))); - off = rpc_align(off, __alignof(typeof(((uint16_t)1)))); - do - { - if (1 == 1) - { - if (1 == 1 || 1 == 4) - { - int ret = rpc_svr_buf_to_msg_rpc_array_uint32_t_uint8_t_32_t(&var0, (uint8_t *)(value), off, tag.msg_buf_len * (sizeof(void *))); - if (ret < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)}); - } - off = ret; - } - } - } while (0); - do - { - if (2 == 1) - { - if (4 == 1 || 4 == 4) - { - int ret = rpc_svr_buf_to_msg_rpc_obj_handler_t_t(&var1, (uint8_t *)(value), off, tag.msg_buf_len * (sizeof(void *))); - if (ret < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)}); - } - off = ret; - } - } - } while (0); - short ret_val = ns_t_query_op(obj, &var0, &var1); - if (ret_val < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret_val)}); - } - off = 0; - int off_map = 0; - do - { - if (1 == 1) - { - if (1 == 2 || 1 == 4) - { - int ret = rpc_svr_msg_to_buf_rpc_array_uint32_t_uint8_t_32_t(&var0, (uint8_t *)(value), off); - if (ret < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)}); - } - off = ret; - } - } - } while (0); - do - { - if (2 == 1) - { - if (4 == 2 || 4 == 4) - { - int ret = rpc_svr_msg_to_buf_rpc_obj_handler_t_t(&var1, (uint8_t *)(value), off); - if (ret < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)}); - } - off = ret; - } - } - } while (0); - do - { - if (1 == 2) - { - if (1 == 2 || 1 == 4) - { - int ret = rpc_svr_msg_to_buf_rpc_array_uint32_t_uint8_t_32_t(&var0, (uint8_t *)(ipc_msg->map_buf), off_map); - if (ret < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)}); - } - off_map = ret; - } - } - } while (0); - do - { - if (2 == 2) - { - if (4 == 2 || 4 == 4) - { - int ret = rpc_svr_msg_to_buf_rpc_obj_handler_t_t(&var1, (uint8_t *)(ipc_msg->map_buf), off_map); - if (ret < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)}); - } - off_map = ret; - } - } - } while (0); - return ((msg_tag_t){.flags = (0), .msg_buf_len = ((((off) / ((sizeof(void *)))) + (((off) % ((sizeof(void *)))) ? 1 : 0))), .map_buf_len = ((((off_map) / ((sizeof(void *)))) + (((off_map) % ((sizeof(void *)))) ? 1 : 0))), .prot = (ret_val)}); -} +RPC_GENERATION_DISPATCH2(ns_t, NS_QUERY_OP, query, + rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, path, + rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_INOUT, RPC_TYPE_BUF, cli_hd) RPC_DISPATCH2(ns_t, typeof(NS_REGISTER_OP), NS_REGISTER_OP, register, NS_QUERY_OP, query) void ns_init(ns_t *ns) diff --git a/mkrtos_user/lib/sys_util/inc/u_rpc.h b/mkrtos_user/lib/sys_util/inc/u_rpc.h index 19cb9b87b..75e45d7f9 100644 --- a/mkrtos_user/lib/sys_util/inc/u_rpc.h +++ b/mkrtos_user/lib/sys_util/inc/u_rpc.h @@ -286,97 +286,8 @@ RPC_TYPE_DEF_ALL(int) //!< 定义所有的 * @brief 定义一个32字节长度的数组 * */ -// RPC_ARRAY_DEF(uint32_t, uint8_t, 32) -typedef struct rpc_array_uint32_t_uint8_t_32 -{ - uint32_t len; - uint8_t data[32]; -} rpc_array_uint32_t_uint8_t_32_t; -static inline int rpc_svr_msg_to_buf_rpc_array_uint32_t_uint8_t_32_t(rpc_array_uint32_t_uint8_t_32_t *d, uint8_t *buf, int len) -{ - if (rpc_align(len, __alignof(d->len)) > 96) - { - return -1024; - } - len = rpc_align(len, __alignof(d->len)); - *((typeof(d->len) *)(&buf[len])) = d->len; - if (rpc_align(len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > 96) - { - return -1024; - } - len += sizeof(d->len); - len = rpc_align(len, __alignof(d->data[0])); - for (int i = 0; i < d->len * sizeof(d->data[0]); i++) - { - buf[i + len] = ((uint8_t *)(d->data))[i]; - } - len += d->len * sizeof(d->data[0]); - return len; -} -static inline int rpc_svr_buf_to_msg_rpc_array_uint32_t_uint8_t_32_t(rpc_array_uint32_t_uint8_t_32_t *d, uint8_t *buf, int len, int max) -{ - if (rpc_align(len, __alignof(d->len)) > max) - { - return -1024; - } - len = rpc_align(len, __alignof(d->len)); - d->len = *((typeof(d->len) *)(&buf[len])); - if (rpc_align(len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > max) - { - return -1024; - } - len += sizeof(d->len); - len = rpc_align(len, __alignof(d->data[0])); - for (int i = 0; i < d->len * sizeof(d->data[0]); i++) - { - ((uint8_t *)(d->data))[i] = buf[i + len]; - } - len += d->len * sizeof(d->data[0]); - return len; -} -static inline int rpc_cli_msg_to_buf_rpc_array_uint32_t_uint8_t_32_t(rpc_array_uint32_t_uint8_t_32_t *d, uint8_t *buf, int len) -{ - if (rpc_align(len, __alignof(d->len)) > 96) - { - return -1024; - } - len = rpc_align(len, __alignof(d->len)); - *((typeof(d->len) *)(&buf[len])) = d->len; - if (rpc_align(len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > 96) - { - return -1024; - } - len += sizeof(d->len); - len = rpc_align(len, __alignof(d->data[0])); - for (int i = 0; i < d->len * sizeof(d->data[0]); i++) - { - buf[i + len] = ((uint8_t *)(d->data))[i]; - } - len += d->len * sizeof(d->data[0]); - return len; -} -static inline int rpc_cli_buf_to_msg_rpc_array_uint32_t_uint8_t_32_t(rpc_array_uint32_t_uint8_t_32_t *d, uint8_t *buf, int len, int max) -{ - if (rpc_align(len, __alignof(d->len)) > max) - { - return -1024; - } - len = rpc_align(len, __alignof(d->len)); - d->len = *((typeof(d->len) *)(&buf[len])); - if (rpc_align(len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > max) - { - return -1024; - } - len += sizeof(d->len); - len = rpc_align(len, __alignof(d->data[0])); - for (int i = 0; i < d->len * sizeof(d->data[0]); i++) - { - ((uint8_t *)(d->data))[i] = buf[i + len]; - } - len += d->len * sizeof(d->data[0]); - return len; -} -static inline void rpc_var_rpc_array_uint32_t_uint8_t_32_t_init(rpc_array_uint32_t_uint8_t_32_t *d) {} +RPC_ARRAY_DEF(uint32_t, uint8_t, 32) + /** * @brief 引用类型的数组定义,数组的数据来自其它地方 * diff --git a/mkrtos_user/server/app/drv/drv.c b/mkrtos_user/server/app/drv/drv.c index ae7ab4f27..a52600404 100644 --- a/mkrtos_user/server/app/drv/drv.c +++ b/mkrtos_user/server/app/drv/drv.c @@ -22,6 +22,7 @@ #include "MDM_RTU_APP.h" #include "e180-zg120.h" #include "timer.h" +#include "sysinfo.h" #include void music2_send_bytes(u8 *bytes, int len) @@ -45,6 +46,7 @@ void drv_init(void) init_uart4(115200); ext_input_check(); wk2xx_hw_init(); + rs485_init(); Wk_DeInit(1); Wk_DeInit(2); Wk_DeInit(3); @@ -53,7 +55,6 @@ void drv_init(void) Wk_Init(2); Wk_Init(3); Wk_Init(4); - rs485_init(); Wk_SetBaud(1, B115200); Wk_SetBaud(2, B115200); Wk_SetBaud(3, B115200); @@ -62,8 +63,12 @@ void drv_init(void) spl0601_init(); LCD_init(); - bluetooth_set_CP(0, "02"); - bluetooth_set_CP(1, "02"); + if (sys_info_read() < 0) + { + sys_info_save(); + bluetooth_set_CP(0, "02"); + bluetooth_set_CP(1, "02"); + } bluetooth_init_cfg(0, usart2_send_bytes); bluetooth_init_cfg(1, music2_send_bytes); diff --git a/mkrtos_user/server/app/drv/e180-zg120.c b/mkrtos_user/server/app/drv/e180-zg120.c index 80bcd40fd..a0add293e 100644 --- a/mkrtos_user/server/app/drv/e180-zg120.c +++ b/mkrtos_user/server/app/drv/e180-zg120.c @@ -6,6 +6,7 @@ #include "u_queue.h" #include "u_log.h" #include "u_env.h" +#include "u_sleep.h" #include "e180-zg120.h" #include #include @@ -530,6 +531,7 @@ static void wait_pack(int wait_timeout) last_tick = sys_read_tick(); last_len = q_queue_len(q); } + // u_sleep_ms(1); } } /** diff --git a/mkrtos_user/server/app/drv/spi2.c b/mkrtos_user/server/app/drv/spi2.c index 20fa9d0c5..03364b8cb 100644 --- a/mkrtos_user/server/app/drv/spi2.c +++ b/mkrtos_user/server/app/drv/spi2.c @@ -33,7 +33,7 @@ void SPI2_Init(void) SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; // 串行同步时钟的空闲状态为高电平 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; // 串行同步时钟的第二个跳变沿(上升或下降)数据被采样 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制 - SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; // 定义波特率预分频的值:波特率预分频值为256 + SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; // 定义波特率预分频的值:波特率预分频值为256 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; // 指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始 SPI_InitStructure.SPI_CRCPolynomial = 7; // CRC值计算的多项式 SPI_Init(SPI2, &SPI_InitStructure); // 根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器 diff --git a/mkrtos_user/server/app/drv/sysinfo.c b/mkrtos_user/server/app/drv/sysinfo.c index b6a8eb4f6..9ee5c13e0 100644 --- a/mkrtos_user/server/app/drv/sysinfo.c +++ b/mkrtos_user/server/app/drv/sysinfo.c @@ -21,7 +21,7 @@ void sys_info_unlock(void) int sys_info_save(void) { - int fd = fs_open("/sys_info.bin", O_CREAT | O_WRONLY, 0777); + int fd = fs_open("/mnt/sys_info.bin", O_CREAT | O_WRONLY, 0777); if (fd < 0) { return fd; @@ -40,7 +40,7 @@ int sys_info_save(void) } int sys_info_read(void) { - int fd = fs_open("/sys_info.bin", O_CREAT | O_RDONLY, 0777); + int fd = fs_open("/mnt/sys_info.bin", O_CREAT | O_RDONLY, 0777); if (fd < 0) { return fd; diff --git a/mkrtos_user/server/app/drv/sysinfo.h b/mkrtos_user/server/app/drv/sysinfo.h index 685ce22ff..d3a3a6dbc 100644 --- a/mkrtos_user/server/app/drv/sysinfo.h +++ b/mkrtos_user/server/app/drv/sysinfo.h @@ -20,6 +20,7 @@ typedef struct uint8_t netID; uint8_t devID; + int init_val; } uapp_sys_info_t; extern uapp_sys_info_t sys_info; diff --git a/mkrtos_user/server/app/drv/uart5.c b/mkrtos_user/server/app/drv/uart5.c index adbe04e79..c24b9bee3 100644 --- a/mkrtos_user/server/app/drv/uart5.c +++ b/mkrtos_user/server/app/drv/uart5.c @@ -7,6 +7,7 @@ #include "u_hd_man.h" #include "u_local_thread.h" #include "u_sleep.h" +#include "MDM_RTU_Serial.h" #include #include static obj_handler_t irq_obj; @@ -23,19 +24,19 @@ void init_uart5(u32 baudRate) USART_InitTypeDef USART_InitStructure = {0}; NVIC_InitTypeDef NVIC_InitStructure = {0}; - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 使能GPIOC时钟 - RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE); // 使能串口3时钟 + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE); // 使能GPIOC时钟 + RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE); // 使能串口3时钟 USART_DeInit(UART5); - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 设置PA2为复用推挽输出 GPIO_Init(GPIOC, &GPIO_InitStructure); - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 设置PA3为浮空输入 - GPIO_Init(GPIOC, &GPIO_InitStructure); - GPIO_SetBits(GPIOC, GPIO_Pin_10); + GPIO_Init(GPIOD, &GPIO_InitStructure); + GPIO_SetBits(GPIOD, GPIO_Pin_2); USART_InitStructure.USART_BaudRate = baudRate; // 设置串口波特率为115200 USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 字长为8位数据格式 @@ -75,8 +76,8 @@ static void *UART5_IRQHandler(void *arg) { USART_ClearITPendingBit(UART5, USART_IT_RXNE); // 清除中断标志 uint8_t data = USART_ReceiveData(UART5); - // queue_push(data); - // uart5_send_byte(data); + + MDMSerialRecvByte(data); } uirq_ack(irq_obj, UART5_IRQn); } @@ -89,7 +90,7 @@ void uart5_send_byte(u8 byte) while (USART_GetFlagStatus(UART5, USART_FLAG_TXE) == RESET) ; USART_SendData(UART5, byte); - while (USART_GetFlagStatus(UART5, USART_FLAG_TXE) == RESET) + while (USART_GetFlagStatus(UART5, USART_FLAG_TC) == RESET) ; } void uart5_send_bytes(u8 *bytes, int len) diff --git a/mkrtos_user/server/app/drv/wk2xx_hw.c b/mkrtos_user/server/app/drv/wk2xx_hw.c index f979f3ad4..5c3cc7117 100644 --- a/mkrtos_user/server/app/drv/wk2xx_hw.c +++ b/mkrtos_user/server/app/drv/wk2xx_hw.c @@ -9,6 +9,7 @@ #include "spi2.h" #include "delay.h" #include "wk2xx.h" +#include "MDM_RTU_Serial.h" #include // #include "MDM_RTU_Serial.h" static obj_handler_t irq_obj; @@ -100,7 +101,7 @@ static void *exti_12_irq(void *arg) recv_len = wk_RxChars(4, wk_recv_buf[3]); for (int i = 0; i < recv_len; i++) { - // MDMSerialRecvByte(wk_recv_buf[3][i]);TODO: + MDMSerialRecvByte(wk_recv_buf[3][i]); } break; } diff --git a/mkrtos_user/server/app/hmi_lcd/hmi_lcd_process.c b/mkrtos_user/server/app/hmi_lcd/hmi_lcd_process.c index 14100f3cb..e8c0dbba6 100644 --- a/mkrtos_user/server/app/hmi_lcd/hmi_lcd_process.c +++ b/mkrtos_user/server/app/hmi_lcd/hmi_lcd_process.c @@ -2,9 +2,7 @@ #include "hmi_lcd_process.h" #include "stm32_sys.h" -// #include "tim3.h" #include "sysinfo.h" -// #include "save_info.h" #include "led.h" #include "relay.h" #include "music_control.h" diff --git a/mkrtos_user/server/app/modbus/MDM_RTU_Serial.c b/mkrtos_user/server/app/modbus/MDM_RTU_Serial.c index 7dc2e8b58..b472812e7 100644 --- a/mkrtos_user/server/app/modbus/MDM_RTU_Serial.c +++ b/mkrtos_user/server/app/modbus/MDM_RTU_Serial.c @@ -54,7 +54,7 @@ void MDMInitSerial(void *obj, uint32 baud, uint8 dataBits, uint8 stopBit, uint8 /*Hardware initialization*/ assert(baud == 9600); Wk_SetBaud(WK_UART_NUM1, B9600); - init_uart5(B9600); + init_uart5(baud); } /******************************************************* * @@ -121,4 +121,5 @@ void MDMSerialSendBytes(uint8 *bytes, uint16 num) wk_TxChars(WK_UART_NUM1, num, bytes); // 等待发送完成 wk_wait_tx_done(WK_UART_NUM1); + } diff --git a/mkrtos_user/server/app/src/main.c b/mkrtos_user/server/app/src/main.c index e315d3f4e..b182fa553 100644 --- a/mkrtos_user/server/app/src/main.c +++ b/mkrtos_user/server/app/src/main.c @@ -26,15 +26,15 @@ #include "auto_close.h" #include "u_str.h" #include "e180-zg120.h" +#include "MDM_RTU_APP.h" #include #include #include int main(int argc, char *args[]) { printf("argc:%d args[0]:%s\n", argc, args[0]); - drv_init(); u_sleep_ms(100); - sys_info_read(); + drv_init(); // sys_info.devID = 12; // sys_info_save(); // sys_info.devID = 0; @@ -48,8 +48,9 @@ int main(int argc, char *args[]) } while (1) { + MDM_RTU_Loop(); user_spl0601_get(); - temps_cal(); + temp_cal(); UpdateUI(); usart2_loop(); io_ctrl_loop(); diff --git a/mkrtos_user/server/app/util/temp_cal.c b/mkrtos_user/server/app/util/temp_cal.c index c94b08c56..963284e31 100644 --- a/mkrtos_user/server/app/util/temp_cal.c +++ b/mkrtos_user/server/app/util/temp_cal.c @@ -2,8 +2,10 @@ #include "adc.h" #include "temp_cal.h" #include "sysinfo.h" +#include "u_sys.h" +#include "relay.h" #include - +#define TEMP_ADJUST_TIMES 6000 // ms // Rt = R *EXP(B*(1/T1-1/T2)) // 这里T1和T2指的是K度即开尔文温度,K度=273.15(绝对温度)+摄氏度;其中T2=(273.15+25) // Rt 是热敏电阻在T1温度下的阻值; @@ -79,3 +81,24 @@ void temps_cal(void) } } } +static u32 temp_adjust_tick_last_update = 0; +void temp_cal(void) +{ + + temps_cal(); // 计算温度值 8路 + + // 调温处理 + // 温度处理 + if (sys_read_tick() - temp_adjust_tick_last_update >= TEMP_ADJUST_TIMES) + { + temp_adjust_tick_last_update = sys_read_tick(); + if ((int)(sys_info.temp[0]) > sys_info.target_val) + { + relay_ctrl(5, 0); + } + else + { + relay_ctrl(5, 1); + } + } +} \ No newline at end of file diff --git a/mkrtos_user/server/app/util/temp_cal.h b/mkrtos_user/server/app/util/temp_cal.h index 65793c6c2..e0f82991c 100644 --- a/mkrtos_user/server/app/util/temp_cal.h +++ b/mkrtos_user/server/app/util/temp_cal.h @@ -5,4 +5,4 @@ #define TEMP_MAX_VAL 100 #define TEMP_MIN_VAL -40 -void temps_cal(void); +void temp_cal(void); diff --git a/mkrtos_user/server/init/src/namespace.c b/mkrtos_user/server/init/src/namespace.c index c14d72856..0186d5dc0 100644 --- a/mkrtos_user/server/init/src/namespace.c +++ b/mkrtos_user/server/init/src/namespace.c @@ -68,11 +68,11 @@ int namespace_query(const char *path, obj_handler_t *hd) { if (ns.ne_list[i].hd != HANDLER_INVALID) { - char *split_str = strstr(ns.ne_list[i].path, path); - if (split_str && (split_str == ns.ne_list[i].path)) + char *split_str = strstr(path, ns.ne_list[i].path); + if (split_str && (split_str == path)) { *hd = ns.ne_list[i].hd; - return (int)(split_str - ns.ne_list[i].path); + return (int)(strlen(ns.ne_list[i].path)); } } } diff --git a/setting.cmake b/setting.cmake index e9e6d89bb..873b89d9e 100755 --- a/setting.cmake +++ b/setting.cmake @@ -20,7 +20,7 @@ set(CMAKE_SIZE "${CROSS_COMPILE}size" CACHE PATH "" FORCE) # -mfloat-abi=soft -u _printf_float -set(CMAKE_C_FLAGS "-mcpu=cortex-m3 -mthumb -O0 -g -lc -lrdimon -msoft-float -u _printf_float \ +set(CMAKE_C_FLAGS "-mcpu=cortex-m3 -mthumb -O0 -g3 -lc -lrdimon -msoft-float -u _printf_float \ -std=gnu11 -ffunction-sections -fdata-sections -fno-builtin \ -nostartfiles -nodefaultlibs -nostdlib -nostdinc -Xlinker \ --gc-sections -fno-stack-protector \