|
@@ -153,8 +153,14 @@ eMBRTUReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength )
|
|
|
eMBErrorCode eStatus = MB_ENOERR;
|
|
eMBErrorCode eStatus = MB_ENOERR;
|
|
|
|
|
|
|
|
ENTER_CRITICAL_SECTION( );
|
|
ENTER_CRITICAL_SECTION( );
|
|
|
- assert( usRcvBufferPos < MB_SER_PDU_SIZE_MAX );
|
|
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
|
|
+ //assert( usRcvBufferPos < MB_SER_PDU_SIZE_MAX );
|
|
|
|
|
+ if(usRcvBufferPos >= MB_SER_PDU_SIZE_MAX)
|
|
|
|
|
+ {
|
|
|
|
|
+ eStatus = MB_EIO;
|
|
|
|
|
+ EXIT_CRITICAL_SECTION( );
|
|
|
|
|
+ return eStatus;
|
|
|
|
|
+ }
|
|
|
/* Length and CRC check */
|
|
/* Length and CRC check */
|
|
|
if( ( usRcvBufferPos >= MB_SER_PDU_SIZE_MIN )
|
|
if( ( usRcvBufferPos >= MB_SER_PDU_SIZE_MIN )
|
|
|
&& ( usMBCRC16( ( UCHAR * ) ucRTUBuf, usRcvBufferPos ) == 0 ) )
|
|
&& ( usMBCRC16( ( UCHAR * ) ucRTUBuf, usRcvBufferPos ) == 0 ) )
|
|
@@ -237,7 +243,12 @@ xMBRTUReceiveFSM( void )
|
|
|
BOOL xTaskNeedSwitch = FALSE;
|
|
BOOL xTaskNeedSwitch = FALSE;
|
|
|
UCHAR ucByte;
|
|
UCHAR ucByte;
|
|
|
|
|
|
|
|
- assert( eSndState == STATE_TX_IDLE );
|
|
|
|
|
|
|
+ //assert( eSndState == STATE_TX_IDLE );
|
|
|
|
|
+ if(eSndState != STATE_TX_IDLE)
|
|
|
|
|
+ {
|
|
|
|
|
+ eMBDisable();
|
|
|
|
|
+ return xTaskNeedSwitch;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
/* Always read the character. */
|
|
/* Always read the character. */
|
|
|
( void )xMBPortSerialGetByte( ( CHAR * ) & ucByte );
|
|
( void )xMBPortSerialGetByte( ( CHAR * ) & ucByte );
|
|
@@ -296,8 +307,18 @@ xMBRTUTransmitFSM( void )
|
|
|
{
|
|
{
|
|
|
BOOL xNeedPoll = FALSE;
|
|
BOOL xNeedPoll = FALSE;
|
|
|
|
|
|
|
|
- assert( eRcvState == STATE_RX_IDLE );
|
|
|
|
|
-
|
|
|
|
|
|
|
+ //assert( eRcvState == STATE_RX_IDLE );
|
|
|
|
|
+ if(eRcvState != STATE_RX_IDLE)
|
|
|
|
|
+ {
|
|
|
|
|
+ eMBDisable();
|
|
|
|
|
+ return xNeedPoll;
|
|
|
|
|
+ }
|
|
|
|
|
+// if(eRcvState != STATE_RX_IDLE)
|
|
|
|
|
+// {
|
|
|
|
|
+// eMBDisable();
|
|
|
|
|
+// eMBRTUStart();
|
|
|
|
|
+// return xNeedPoll;
|
|
|
|
|
+// }
|
|
|
switch ( eSndState )
|
|
switch ( eSndState )
|
|
|
{
|
|
{
|
|
|
/* We should not get a transmitter event if the transmitter is in
|
|
/* We should not get a transmitter event if the transmitter is in
|
|
@@ -320,8 +341,9 @@ xMBRTUTransmitFSM( void )
|
|
|
xNeedPoll = xMBPortEventPost( EV_FRAME_SENT );
|
|
xNeedPoll = xMBPortEventPost( EV_FRAME_SENT );
|
|
|
/* Disable transmitter. This prevents another transmit buffer
|
|
/* Disable transmitter. This prevents another transmit buffer
|
|
|
* empty interrupt. */
|
|
* empty interrupt. */
|
|
|
- vMBPortSerialEnable( TRUE, FALSE );
|
|
|
|
|
- eSndState = STATE_TX_IDLE;
|
|
|
|
|
|
|
+ eSndState = STATE_TX_IDLE;
|
|
|
|
|
+ vMBPortSerialEnable( TRUE, FALSE );
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
@@ -353,8 +375,13 @@ xMBRTUTimerT35Expired( void )
|
|
|
|
|
|
|
|
/* Function called in an illegal state. */
|
|
/* Function called in an illegal state. */
|
|
|
default:
|
|
default:
|
|
|
- assert( ( eRcvState == STATE_RX_INIT ) ||
|
|
|
|
|
- ( eRcvState == STATE_RX_RCV ) || ( eRcvState == STATE_RX_ERROR ) );
|
|
|
|
|
|
|
+ {
|
|
|
|
|
+ eMBDisable();
|
|
|
|
|
+ eRcvState = STATE_RX_IDLE;
|
|
|
|
|
+ return xNeedPoll;
|
|
|
|
|
+ // assert( ( eRcvState == STATE_RX_INIT ) ||
|
|
|
|
|
+ // ( eRcvState == STATE_RX_RCV ) || ( eRcvState == STATE_RX_ERROR ) );
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
vMBPortTimersDisable( );
|
|
vMBPortTimersDisable( );
|