Merge branch 'bugfix/freemodbus_fix_opt_perf_comm_fail' into 'master'

freemodbus fix comm fail when optimization for performance option is active

Closes IDFGH-2371

See merge request espressif/esp-idf!8682
This commit is contained in:
Michael (XIAO Xufeng) 2020-06-15 15:20:43 +08:00
commit 35a34b0f94
5 changed files with 15 additions and 7 deletions

View file

@ -320,13 +320,14 @@ xMBMasterASCIIReceiveFSM( void )
{ {
/* Disable character timeout timer because all characters are /* Disable character timeout timer because all characters are
* received. */ * received. */
vMBPortTimersDisable( ); vMBMasterPortTimersDisable( );
/* Receiver is again in idle state. */ /* Receiver is again in idle state. */
eRcvState = STATE_M_RX_IDLE; eRcvState = STATE_M_RX_IDLE;
/* Notify the caller of eMBMasterASCIIReceive that a new frame /* Notify the caller of eMBMasterASCIIReceive that a new frame
* was received. */ * was received. */
(void)xMBMasterPortEventPost( EV_MASTER_FRAME_RECEIVED ); (void)xMBMasterPortEventPost( EV_MASTER_FRAME_RECEIVED );
xNeedPoll = FALSE;
} }
else if( ucByte == ':' ) else if( ucByte == ':' )
{ {
@ -355,7 +356,7 @@ xMBMasterASCIITransmitFSM( void )
{ {
BOOL xNeedPoll = TRUE; BOOL xNeedPoll = TRUE;
UCHAR ucByte; UCHAR ucByte;
BOOL xFrameIsBroadcast = FALSE; BOOL xFrameIsBroadcast = FALSE;
assert( eRcvState == STATE_M_RX_IDLE ); assert( eRcvState == STATE_M_RX_IDLE );

View file

@ -367,9 +367,9 @@ eMBPoll( void )
if( ( ucRcvAddress == ucMBAddress ) || ( ucRcvAddress == MB_ADDRESS_BROADCAST ) ) if( ( ucRcvAddress == ucMBAddress ) || ( ucRcvAddress == MB_ADDRESS_BROADCAST ) )
{ {
( void )xMBPortEventPost( EV_EXECUTE ); ( void )xMBPortEventPost( EV_EXECUTE );
ESP_LOG_BUFFER_HEX_LEVEL(MB_PORT_TAG, &ucMBFrame[MB_PDU_FUNC_OFF], usLength, ESP_LOG_DEBUG);
} }
} }
ESP_LOG_BUFFER_HEX_LEVEL(MB_PORT_TAG, &ucMBFrame[MB_PDU_FUNC_OFF], usLength, ESP_LOG_DEBUG);
break; break;
case EV_EXECUTE: case EV_EXECUTE:

View file

@ -292,19 +292,19 @@ eMBMasterPoll( void )
MB_PORT_CLEAR_EVENT( eEvent, EV_MASTER_READY ); MB_PORT_CLEAR_EVENT( eEvent, EV_MASTER_READY );
} else if ( MB_PORT_CHECK_EVENT( eEvent, EV_MASTER_FRAME_RECEIVED ) ) { } else if ( MB_PORT_CHECK_EVENT( eEvent, EV_MASTER_FRAME_RECEIVED ) ) {
eStatus = peMBMasterFrameReceiveCur( &ucRcvAddress, &ucMBFrame, &usLength); eStatus = peMBMasterFrameReceiveCur( &ucRcvAddress, &ucMBFrame, &usLength);
ESP_LOG_BUFFER_HEX_LEVEL("POLL RCV buffer:", (void*)ucMBFrame, (uint16_t)usLength, ESP_LOG_DEBUG);
// Check if the frame is for us. If not ,send an error process event. // Check if the frame is for us. If not ,send an error process event.
if ( ( eStatus == MB_ENOERR ) && ( ucRcvAddress == ucMBMasterGetDestAddress() ) ) if ( ( eStatus == MB_ENOERR ) && ( ucRcvAddress == ucMBMasterGetDestAddress() ) )
{ {
ESP_LOGD(MB_PORT_TAG, "%s: Packet data received successfully (%u).", __func__, eStatus);
( void ) xMBMasterPortEventPost( EV_MASTER_EXECUTE ); ( void ) xMBMasterPortEventPost( EV_MASTER_EXECUTE );
ESP_LOGD(MB_PORT_TAG, "%s: Packet data received successfully (%u).", __func__, eStatus);
ESP_LOG_BUFFER_HEX_LEVEL("POLL RCV buffer", (void*)ucMBFrame, (uint16_t)usLength, ESP_LOG_DEBUG);
} }
else else
{ {
vMBMasterSetErrorType(EV_ERROR_RECEIVE_DATA); vMBMasterSetErrorType(EV_ERROR_RECEIVE_DATA);
( void ) xMBMasterPortEventPost( EV_MASTER_ERROR_PROCESS );
ESP_LOGD( MB_PORT_TAG, "%s: Packet data receive failed (addr=%u)(%u).", ESP_LOGD( MB_PORT_TAG, "%s: Packet data receive failed (addr=%u)(%u).",
__func__, ucRcvAddress, eStatus); __func__, ucRcvAddress, eStatus);
( void ) xMBMasterPortEventPost( EV_MASTER_ERROR_PROCESS );
} }
MB_PORT_CLEAR_EVENT( eEvent, EV_MASTER_FRAME_RECEIVED ); MB_PORT_CLEAR_EVENT( eEvent, EV_MASTER_FRAME_RECEIVED );
} else if ( MB_PORT_CHECK_EVENT( eEvent, EV_MASTER_EXECUTE ) ) { } else if ( MB_PORT_CHECK_EVENT( eEvent, EV_MASTER_EXECUTE ) ) {
@ -371,6 +371,8 @@ eMBMasterPoll( void )
if (eStatus != MB_ENOERR) if (eStatus != MB_ENOERR)
{ {
ESP_LOGE( MB_PORT_TAG, "%s:Frame send error. %d", __func__, eStatus ); ESP_LOGE( MB_PORT_TAG, "%s:Frame send error. %d", __func__, eStatus );
} else {
ESP_LOG_BUFFER_HEX_LEVEL("Sent buffer", (void*)ucMBFrame, usMBMasterGetPDUSndLength(), ESP_LOG_DEBUG);
} }
MB_PORT_CLEAR_EVENT( eEvent, EV_MASTER_FRAME_TRANSMIT ); MB_PORT_CLEAR_EVENT( eEvent, EV_MASTER_FRAME_TRANSMIT );
} else if ( MB_PORT_CHECK_EVENT( eEvent, EV_MASTER_FRAME_SENT ) ) { } else if ( MB_PORT_CHECK_EVENT( eEvent, EV_MASTER_FRAME_SENT ) ) {

View file

@ -91,11 +91,14 @@ xMBPortEventPost( eMBEventType eEvent )
if( (BOOL)xPortInIsrContext() == TRUE ) if( (BOOL)xPortInIsrContext() == TRUE )
{ {
xStatus = xQueueSendFromISR(xQueueHdl, (const void*)&eEvent, &xHigherPriorityTaskWoken); xStatus = xQueueSendFromISR(xQueueHdl, (const void*)&eEvent, &xHigherPriorityTaskWoken);
MB_PORT_CHECK((xStatus == pdTRUE), FALSE, "%s: Post message failure.", __func__);
if ( xHigherPriorityTaskWoken ) if ( xHigherPriorityTaskWoken )
{ {
portYIELD_FROM_ISR(); portYIELD_FROM_ISR();
} }
if (xStatus != pdTRUE) {
ESP_EARLY_LOGV(MB_PORT_TAG, "%s: Post message failure = %d.", __func__, xStatus);
return FALSE;
}
} }
else else
{ {

View file

@ -139,6 +139,8 @@ static void vUartTask(void* pvParameters)
// Read received data and send it to modbus stack // Read received data and send it to modbus stack
usResult = usMBMasterPortSerialRxPoll(xEvent.size); usResult = usMBMasterPortSerialRxPoll(xEvent.size);
ESP_LOGD(TAG,"Timeout occured, processed: %d bytes", usResult); ESP_LOGD(TAG,"Timeout occured, processed: %d bytes", usResult);
// Block receiver task until data is not processed
vTaskSuspend(NULL);
} }
break; break;
//Event of HW FIFO overflow detected //Event of HW FIFO overflow detected