diff --git a/freemodbus/common/esp_modbus_master.c b/freemodbus/common/esp_modbus_master.c index 33988a2..cfacf40 100644 --- a/freemodbus/common/esp_modbus_master.c +++ b/freemodbus/common/esp_modbus_master.c @@ -237,6 +237,24 @@ eMBErrorCode eMBMasterRegInputCB(UCHAR * pucRegBuffer, USHORT usAddress, return error; } +/** + * Helper function to get current transaction info + */ +esp_err_t mbc_master_get_transaction_info(mb_trans_info_t *ptinfo) +{ + mb_trans_info_t tinfo = {0}; + MB_MASTER_CHECK((ptinfo), + ESP_ERR_INVALID_ARG, + "Wrong argument."); + MB_MASTER_CHECK(xMBMasterGetLastTransactionInfo(&tinfo.trans_id, &tinfo.dest_addr, + &tinfo.func_code, &tinfo.exception, + &tinfo.err_type), + ESP_ERR_INVALID_STATE, + "Master can not get transaction info."); + *ptinfo = tinfo; + return ESP_OK; +} + // Helper function to set parameter buffer according to its type esp_err_t mbc_master_set_param_data(void* dest, void* src, mb_descr_type_t param_type, size_t param_size) { diff --git a/freemodbus/common/include/esp_modbus_master.h b/freemodbus/common/include/esp_modbus_master.h index 463cf0f..672a0dc 100644 --- a/freemodbus/common/include/esp_modbus_master.h +++ b/freemodbus/common/include/esp_modbus_master.h @@ -150,6 +150,17 @@ typedef struct { uint16_t reg_size; /*!< Modbus number of registers */ } mb_param_request_t; +/** + * @brief Modbus transacion info structure + */ +typedef struct { + uint64_t trans_id; /*!< Modbus unique transaction identificator */ + uint8_t dest_addr; /*!< Modbus destination short address (or UID) */ + uint8_t func_code; /*!< Modbus last transaction function code */ + uint8_t exception; /*!< Modbus last transaction exception code returned by slave */ + uint16_t err_type; /*!< Modbus last transaction error type */ +} mb_trans_info_t; + /** * @brief Initialize Modbus controller and stack for TCP port * @@ -321,6 +332,18 @@ esp_err_t mbc_master_set_parameter(uint16_t cid, char* name, uint8_t* value, uin */ esp_err_t mbc_master_set_param_data(void* dest, void* src, mb_descr_type_t param_type, size_t param_size); +/** + * @brief The helper function to expose transaction info from modbus layer + * + * @param[in] ptinfo the pointer to transaction info structure + * + * @return + * - esp_err_t ESP_OK - the transaction info is saved in the appropriate parameter structure + * - esp_err_t ESP_ERR_INVALID_ARG - invalid argument of function or parameter descriptor + * - esp_err_t ESP_ERR_INVALID_STATE - invalid state during data processing or allocation failure +*/ +esp_err_t mbc_master_get_transaction_info(mb_trans_info_t *ptinfo); + #ifdef __cplusplus } #endif diff --git a/freemodbus/common/mbc_master.h b/freemodbus/common/mbc_master.h index 4ffe4ff..a736fab 100644 --- a/freemodbus/common/mbc_master.h +++ b/freemodbus/common/mbc_master.h @@ -18,6 +18,7 @@ #include "esp_modbus_common.h" // for common types #include "esp_modbus_master.h" // for public master types #include "esp_modbus_callbacks.h" +#include "mb_m.h" // this is required to expose current transaction info /* ----------------------- Defines ------------------------------------------*/ diff --git a/freemodbus/modbus/include/mb_m.h b/freemodbus/modbus/include/mb_m.h index 9201dea..148ed18 100644 --- a/freemodbus/modbus/include/mb_m.h +++ b/freemodbus/modbus/include/mb_m.h @@ -100,9 +100,9 @@ typedef enum */ typedef enum { - MB_TMODE_T35, /*!< Master receive frame T3.5 timeout. */ - MB_TMODE_RESPOND_TIMEOUT, /*!< Master wait respond for slave. */ - MB_TMODE_CONVERT_DELAY /*!< Master sent broadcast ,then delay sometime.*/ + MB_TMODE_T35, /*!< Master receive frame T3.5 timeout. */ + MB_TMODE_RESPOND_TIMEOUT, /*!< Master wait respond for slave. */ + MB_TMODE_CONVERT_DELAY /*!< Master sent broadcast ,then delay sometime.*/ } eMBMasterTimerMode; /* ----------------------- Function prototypes ------------------------------*/ @@ -128,7 +128,7 @@ typedef enum * - eMBErrorCode::MB_EPORTERR IF the porting layer returned an error. */ eMBErrorCode eMBMasterSerialInit( eMBMode eMode, UCHAR ucPort, - ULONG ulBaudRate, eMBParity eParity ); + ULONG ulBaudRate, eMBParity eParity ); /*! \ingroup modbus * \brief Initialize the Modbus Master protocol stack for Modbus TCP. @@ -220,7 +220,7 @@ eMBErrorCode eMBMasterPoll( void ); * valid it returns eMBErrorCode::MB_EINVAL. */ eMBErrorCode eMBMasterRegisterCB( UCHAR ucFunctionCode, - pxMBFunctionHandler pxHandler ); + pxMBFunctionHandler pxHandler ); /* ----------------------- Callback -----------------------------------------*/ @@ -261,7 +261,7 @@ eMBErrorCode eMBMasterRegisterCB( UCHAR ucFunctionCode, * ILLEGAL DATA ADDRESS is sent as a response. */ eMBErrorCode eMBMasterRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNRegs ); + USHORT usNRegs ); /*! \ingroup modbus_registers * \brief Callback function used if a Holding Register value is @@ -290,7 +290,7 @@ eMBErrorCode eMBMasterRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, * ILLEGAL DATA ADDRESS is sent as a response. */ eMBErrorCode eMBMasterRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNRegs, eMBRegisterMode eMode ); + USHORT usNRegs, eMBRegisterMode eMode ); /*! \ingroup modbus_registers * \brief Callback function used if a Coil Register value is @@ -319,7 +319,7 @@ eMBErrorCode eMBMasterRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, * ILLEGAL DATA ADDRESS is sent as a response. */ eMBErrorCode eMBMasterRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNCoils, eMBRegisterMode eMode ); + USHORT usNCoils, eMBRegisterMode eMode ); /*! \ingroup modbus_registers * \brief Callback function used if a Input Discrete Register value is @@ -342,7 +342,7 @@ eMBErrorCode eMBMasterRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, * ILLEGAL DATA ADDRESS is sent as a response. */ eMBErrorCode eMBMasterRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNDiscrete ); + USHORT usNDiscrete ); /*! \ingroup modbus *\brief These Modbus functions are called for user when Modbus run in Master Mode. @@ -353,20 +353,20 @@ eMBMasterReqErrCode eMBMasterReqWriteHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usRegData, LONG lTimeOut ); eMBMasterReqErrCode eMBMasterReqWriteMultipleHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, - USHORT usNRegs, USHORT * pusDataBuffer, LONG lTimeOut ); + USHORT usNRegs, USHORT * pusDataBuffer, LONG lTimeOut ); eMBMasterReqErrCode eMBMasterReqReadHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs, LONG lTimeOut ); eMBMasterReqErrCode eMBMasterReqReadWriteMultipleHoldingRegister( UCHAR ucSndAddr, - USHORT usReadRegAddr, USHORT usNReadRegs, USHORT * pusDataBuffer, - USHORT usWriteRegAddr, USHORT usNWriteRegs, LONG lTimeOut ); + USHORT usReadRegAddr, USHORT usNReadRegs, USHORT * pusDataBuffer, + USHORT usWriteRegAddr, USHORT usNWriteRegs, LONG lTimeOut ); eMBMasterReqErrCode eMBMasterReqReadCoils( UCHAR ucSndAddr, USHORT usCoilAddr, USHORT usNCoils, LONG lTimeOut ); eMBMasterReqErrCode eMBMasterReqWriteCoil( UCHAR ucSndAddr, USHORT usCoilAddr, USHORT usCoilData, LONG lTimeOut ); eMBMasterReqErrCode eMBMasterReqWriteMultipleCoils( UCHAR ucSndAddr, - USHORT usCoilAddr, USHORT usNCoils, UCHAR * pucDataBuffer, LONG lTimeOut ); + USHORT usCoilAddr, USHORT usNCoils, UCHAR * pucDataBuffer, LONG lTimeOut ); eMBMasterReqErrCode eMBMasterReqReadDiscreteInputs( UCHAR ucSndAddr, USHORT usDiscreteAddr, USHORT usNDiscreteIn, LONG lTimeOut ); @@ -409,6 +409,9 @@ eMBMasterErrorEventType eMBMasterGetErrorType( void ); void vMBMasterSetErrorType( eMBMasterErrorEventType errorType ); eMBMasterReqErrCode eMBMasterWaitRequestFinish( void ); eMBMode ucMBMasterGetCommMode( void ); +BOOL xMBMasterGetLastTransactionInfo( uint64_t *pxTransId, UCHAR *pucDestAddress, + UCHAR *pucFunctionCode, UCHAR *pucException, + USHORT *pusErrorType ); /* ----------------------- Callback -----------------------------------------*/ diff --git a/freemodbus/modbus/include/mbport.h b/freemodbus/modbus/include/mbport.h index 6de021c..74909b4 100644 --- a/freemodbus/modbus/include/mbport.h +++ b/freemodbus/modbus/include/mbport.h @@ -95,7 +95,7 @@ typedef struct _MbEventType { eMBMasterEventEnum eEvent; /*!< event itself. */ uint64_t xTransactionId; /*!< ID of the transaction */ uint64_t xPostTimestamp; /*!< timestamp of event posted */ - uint64_t xGetTimestamp; /*!< timestamp of event get */ + uint64_t xGetTimestamp; /*!< timestamp of event get */ } xMBMasterEventType; #endif diff --git a/freemodbus/modbus/mb_m.c b/freemodbus/modbus/mb_m.c index 3addcbe..7d28c10 100644 --- a/freemodbus/modbus/mb_m.c +++ b/freemodbus/modbus/mb_m.c @@ -71,12 +71,21 @@ /* ----------------------- Static variables ---------------------------------*/ -static UCHAR ucMBMasterDestAddress; +static UCHAR ucMBMasterDestAddress = 0; static BOOL xMBRunInMasterMode = FALSE; -static volatile eMBMasterErrorEventType eMBMasterCurErrorType; +static volatile eMBMasterErrorEventType eMBMasterCurErrorType = EV_ERROR_INIT; static volatile USHORT usMasterSendPDULength; static volatile eMBMode eMBMasterCurrentMode; +static UCHAR *pucMBSendFrame = NULL; +static UCHAR *pucMBRecvFrame = NULL; +static UCHAR ucRecvAddress = 0; +static UCHAR ucLastFunctionCode = 0; +static UCHAR usLastFrameError = 0; +static eMBException eLastException = MB_EX_NONE; +static uint64_t xLastTransactionId = 0; +static uint64_t xCurTransactionId = 0; + /*------------------------ Shared variables ---------------------------------*/ volatile UCHAR ucMasterSndBuf[MB_SERIAL_BUF_SIZE]; @@ -182,7 +191,13 @@ eMBMasterTCPInit( USHORT ucTCPPort ) { eStatus = MB_EPORTERR; } - + /* initialize the state values. */ + ucRecvAddress = 0; + ucLastFunctionCode = 0; + usLastFrameError = 0; + eLastException = MB_EX_NONE; + xCurTransactionId = 0; + eMBMasterCurErrorType = EV_ERROR_INIT; } return eStatus; } @@ -240,6 +255,13 @@ eMBMasterSerialInit( eMBMode eMode, UCHAR ucPort, ULONG ulBaudRate, eMBParity eP else { eMBState = STATE_DISABLED; + /* initialize the state values. */ + ucRecvAddress = 0; + ucLastFunctionCode = 0; + usLastFrameError = 0; + eLastException = MB_EX_NONE; + xCurTransactionId = 0; + eMBMasterCurErrorType = EV_ERROR_INIT; } /* initialize the OS resource for modbus master. */ vMBMasterOsResInit(); @@ -311,18 +333,14 @@ eMBMasterDisable( void ) eMBErrorCode eMBMasterPoll( void ) { - static UCHAR *pucMBSendFrame = NULL; - static UCHAR *pucMBRecvFrame = NULL; - static UCHAR ucRcvAddress; - static UCHAR ucFunctionCode; - static USHORT usLength; - static eMBException eException; - static uint64_t xCurTransactionId = 0; - int i; - int j; - eMBErrorCode eStatus = MB_ENOERR; + int i; + int j; + eMBErrorCode eStatus = MB_ENOERR; xMBMasterEventType xEvent; eMBMasterErrorEventType errorType; + eMBException eException = MB_EX_NONE; + UCHAR ucFunctionCode = 0; + static USHORT usRecvLength = 0; /* Check if the protocol stack is ready. */ if( eMBState != STATE_ENABLED ) { @@ -352,6 +370,7 @@ eMBMasterPoll( void ) ESP_LOGE( MB_PORT_TAG, "%" PRIu64 ":Frame send error = %d", xEvent.xTransactionId, (unsigned)eStatus ); } xCurTransactionId = xEvent.xTransactionId; + atomic_store(&(xLastTransactionId), xCurTransactionId); break; case EV_MASTER_FRAME_SENT: if (xCurTransactionId == xEvent.xTransactionId) { @@ -361,15 +380,15 @@ eMBMasterPoll( void ) break; case EV_MASTER_FRAME_RECEIVED: ESP_LOGD( MB_PORT_TAG, "%" PRIu64 ":EV_MASTER_FRAME_RECEIVED", xEvent.xTransactionId ); - eStatus = peMBMasterFrameReceiveCur( &ucRcvAddress, &pucMBRecvFrame, &usLength); + eStatus = peMBMasterFrameReceiveCur( &ucRecvAddress, &pucMBRecvFrame, &usRecvLength); if (xCurTransactionId == xEvent.xTransactionId) { MB_PORT_CHECK(pucMBSendFrame, MB_EILLSTATE, "Send buffer initialization fail."); // Check if the frame is for us. If not ,send an error process event. - if ( ( eStatus == MB_ENOERR ) && ( ( ucRcvAddress == ucMBMasterGetDestAddress() ) - || ( ucRcvAddress == MB_TCP_PSEUDO_ADDRESS) ) ) { + if ( ( eStatus == MB_ENOERR ) && ( ( ucRecvAddress == ucMBMasterGetDestAddress() ) + || ( ucRecvAddress == MB_TCP_PSEUDO_ADDRESS) ) ) { if ( ( pucMBRecvFrame[MB_PDU_FUNC_OFF] & ~MB_FUNC_ERROR ) == ( pucMBSendFrame[MB_PDU_FUNC_OFF] ) ) { ESP_LOGD(MB_PORT_TAG, "%" PRIu64 ": Packet data received successfully (%u).", xEvent.xTransactionId, (unsigned)eStatus); - ESP_LOG_BUFFER_HEX_LEVEL("POLL receive buffer", (void*)pucMBRecvFrame, (uint16_t)usLength, ESP_LOG_DEBUG); + ESP_LOG_BUFFER_HEX_LEVEL("POLL receive buffer", (void*)pucMBRecvFrame, (uint16_t)usRecvLength, ESP_LOG_DEBUG); ( void ) xMBMasterPortEventPost( EV_MASTER_EXECUTE ); } else { ESP_LOGE( MB_PORT_TAG, "Drop incorrect frame, receive_func(%u) != send_func(%u)", @@ -381,7 +400,7 @@ eMBMasterPoll( void ) vMBMasterSetErrorType(EV_ERROR_RECEIVE_DATA); ( void ) xMBMasterPortEventPost( EV_MASTER_ERROR_PROCESS ); ESP_LOGD( MB_PORT_TAG, "%" PRIu64 ": Packet data receive failed (addr=%u)(%u).", - xEvent.xTransactionId, (unsigned)ucRcvAddress, (unsigned)eStatus); + xEvent.xTransactionId, (unsigned)ucRecvAddress, (unsigned)eStatus); } } else { // Ignore the `EV_MASTER_FRAME_RECEIVED` event because the respond timeout occurred @@ -398,6 +417,7 @@ eMBMasterPoll( void ) MB_PORT_CHECK(pucMBRecvFrame, MB_EILLSTATE, "receive buffer initialization fail."); ESP_LOGD(MB_PORT_TAG, "%" PRIu64 ":EV_MASTER_EXECUTE", xEvent.xTransactionId); ucFunctionCode = pucMBRecvFrame[MB_PDU_FUNC_OFF]; + atomic_store(&(ucLastFunctionCode), ucFunctionCode); eException = MB_EX_ILLEGAL_FUNCTION; /* If receive frame has exception. The receive function code highest bit is 1.*/ if (ucFunctionCode & MB_FUNC_ERROR) { @@ -415,20 +435,21 @@ eMBMasterPoll( void ) * the master need execute function for all slave. */ if ( xMBMasterRequestIsBroadcast() ) { - usLength = usMBMasterGetPDUSndLength(); + USHORT usLength = usMBMasterGetPDUSndLength(); for(j = 1; j <= MB_MASTER_TOTAL_SLAVE_NUM; j++) { vMBMasterSetDestAddress(j); eException = xMasterFuncHandlers[i].pxHandler(pucMBRecvFrame, &usLength); } } else { - eException = xMasterFuncHandlers[i].pxHandler( pucMBRecvFrame, &usLength ); + eException = xMasterFuncHandlers[i].pxHandler(pucMBRecvFrame, &usRecvLength); } vMBMasterSetCBRunInMasterMode( FALSE ); break; } } } + atomic_store(&(eLastException), eException); /* If master has exception, will send error process event. Otherwise the master is idle.*/ if ( eException != MB_EX_NONE ) { vMBMasterSetErrorType( EV_ERROR_EXECUTE_FUNCTION ); @@ -456,24 +477,28 @@ eMBMasterPoll( void ) vMBMasterErrorCBRespondTimeout( xEvent.xTransactionId, ucMBMasterGetDestAddress( ), pucMBSendFrame, usMBMasterGetPDUSndLength( ) ); + atomic_store(&(usLastFrameError), ( UCHAR )errorType); break; case EV_ERROR_RECEIVE_DATA: vMBMasterErrorCBReceiveData( xEvent.xTransactionId, ucMBMasterGetDestAddress( ), - pucMBRecvFrame, usLength, + pucMBRecvFrame, usRecvLength, pucMBSendFrame, usMBMasterGetPDUSndLength( ) ); + atomic_store(&(usLastFrameError), ( UCHAR )errorType); break; case EV_ERROR_EXECUTE_FUNCTION: vMBMasterErrorCBExecuteFunction( xEvent.xTransactionId, ucMBMasterGetDestAddress( ), - pucMBRecvFrame, usLength, + pucMBRecvFrame, usRecvLength, pucMBSendFrame, usMBMasterGetPDUSndLength( ) ); + atomic_store(&(usLastFrameError), ( UCHAR )errorType); break; case EV_ERROR_OK: vMBMasterCBRequestSuccess( xEvent.xTransactionId, ucMBMasterGetDestAddress( ), - pucMBRecvFrame, usLength, + pucMBRecvFrame, usRecvLength, pucMBSendFrame, usMBMasterGetPDUSndLength( ) ); + atomic_store(&(usLastFrameError), ( UCHAR )errorType); break; default: ESP_LOGE( MB_PORT_TAG, "%" PRIu64 ":incorrect error type = %d.", xEvent.xTransactionId, (int)errorType); @@ -583,4 +608,21 @@ eMBMode ucMBMasterGetCommMode(void) return eMBMasterCurrentMode; } +/* Get current transaction information */ +BOOL xMBMasterGetLastTransactionInfo( uint64_t *pxTransId, UCHAR *pucDestAddress, + UCHAR *pucFunctionCode, UCHAR *pucException, + USHORT *pusErrorType ) +{ + BOOL xState = (eMBState == STATE_ENABLED); + if (xState && pxTransId && pucDestAddress && pucFunctionCode + && pucException && pusErrorType) { + *pxTransId = atomic_load(&xLastTransactionId); + *pucDestAddress = ucMBMasterGetDestAddress(); + *pucFunctionCode = atomic_load(&ucLastFunctionCode); + *pucException = (UCHAR) atomic_load(&eLastException); + *pusErrorType = atomic_load(&usLastFrameError); + } + return xState; +} + #endif // MB_MASTER_RTU_ENABLED || MB_MASTER_ASCII_ENABLED || MB_MASTER_TCP_ENABLED diff --git a/freemodbus/port/port.h b/freemodbus/port/port.h index 623f71f..addc45d 100644 --- a/freemodbus/port/port.h +++ b/freemodbus/port/port.h @@ -215,7 +215,7 @@ BOOL xMBPortSerialWaitEvent(QueueHandle_t xMbUartQueue, uart_event_t* pxEvent, U */ MB_ATTR_WEAK void vMBMasterErrorCBUserHandler( uint64_t xTransId, USHORT usError, UCHAR ucDestAddress, const UCHAR* pucRecvData, USHORT ucRecvLength, - const UCHAR* pucSendData, USHORT ucSendLength ); + const UCHAR* pucSendData, USHORT ucSendLength ); #ifdef __cplusplus PR_END_EXTERN_C diff --git a/test/serial/mb_serial_master/main/master.c b/test/serial/mb_serial_master/main/master.c index 113e668..63d3e0a 100644 --- a/test/serial/mb_serial_master/main/master.c +++ b/test/serial/mb_serial_master/main/master.c @@ -392,6 +392,13 @@ static void master_operation_func(void *arg) alarm_state = true; break; } + mb_trans_info_t tinfo = {0}; + if (mbc_master_get_transaction_info(&tinfo) == ESP_OK) { + ESP_LOGI("TRANS_INFO", "Id: %" PRIu64 ", Addr: %x, FC: %x, Exp: %u, Err: %x", + (uint64_t)tinfo.trans_id, (int)tinfo.dest_addr, + (unsigned)tinfo.func_code, (unsigned)tinfo.exception, + (int)tinfo.err_type); + } } else if ((cid >= CID_RELAY_P1) && (cid <= CID_DISCR_P1)) { if (TEST_VERIFY_VALUES(param_descriptor, (uint8_t *)temp_data_ptr) == ESP_OK) { uint8_t state = *(uint8_t *)temp_data_ptr; @@ -483,26 +490,22 @@ static esp_err_t master_init(void) return err; } -#ifndef UCHAR -#define UCHAR uint8_t -#define USHORT uint16_t #define MB_PDU_DATA_OFF 1 -#endif #define EV_ERROR_EXECUTE_FUNCTION 3 -void vMBMasterErrorCBUserHandler( uint64_t xTransId, USHORT usError, UCHAR ucDestAddress, const UCHAR* pucRecvData, USHORT ucRecvLength, - const UCHAR* pucSendData, USHORT ucSendLength ) +void vMBMasterErrorCBUserHandler( uint64_t xTransId, uint16_t usError, uint8_t ucDestAddress, const uint8_t *pucRecvData, uint16_t ucRecvLength, + const uint8_t *pucSendData, uint16_t ucSendLength ) { - ESP_LOGW("USER_ERR_CB", "The transaction error type: %u", usError); + ESP_LOGW("USER_ERR_CB", "The transaction %" PRIu64 ", error type: %u", xTransId, usError); if ((usError == EV_ERROR_EXECUTE_FUNCTION) && pucRecvData && ucRecvLength) { - ESP_LOGW("USER_ERR_CB", "The command is unsupported or an exception on slave happened: %x", (int)pucRecvData[1]); + ESP_LOGW("USER_ERR_CB", "The command is unsupported or an exception on slave happened: %x", (int)pucRecvData[MB_PDU_DATA_OFF]); } if (pucRecvData && ucRecvLength) { - ESP_LOG_BUFFER_HEX_LEVEL("Received buffer", (void *)pucRecvData, (USHORT)ucRecvLength, ESP_LOG_WARN); + ESP_LOG_BUFFER_HEX_LEVEL("Received buffer", (void *)pucRecvData, (uint16_t)ucRecvLength, ESP_LOG_WARN); } if (pucSendData && ucSendLength) { - ESP_LOG_BUFFER_HEX_LEVEL("Sent buffer", (void *)pucSendData, (USHORT)ucSendLength, ESP_LOG_WARN); + ESP_LOG_BUFFER_HEX_LEVEL("Sent buffer", (void *)pucSendData, (uint16_t)ucSendLength, ESP_LOG_WARN); } }