diff --git a/components/net/freemodbus/modbus/mbmaster.c b/components/net/freemodbus/modbus/mbmaster.c index 17c0fc05f9..af6fc666e1 100644 --- a/components/net/freemodbus/modbus/mbmaster.c +++ b/components/net/freemodbus/modbus/mbmaster.c @@ -24,13 +24,14 @@ #include "mbfunc.h" eMBErrorCode eMBMReadHoldingRegisters (UCHAR ucSlaveAddress, USHORT usRegStartAddress, - UBYTE ubNRegs, USHORT arusBufferOut[]) + UBYTE ubNRegs, UBYTE arusBufferOut[]) { static UCHAR ucMBFrame[5]; eMBErrorCode eStatus = MB_ENOERR; eMBEventType eEvent; static UCHAR ucRcvAddress; static USHORT usLength; + UCHAR *ucRcvFrame; /* make up request frame */ ucMBFrame[0] = MB_FUNC_READ_HOLDING_REGISTER; @@ -38,26 +39,24 @@ eMBErrorCode eMBMReadHoldingRegisters (UCHAR ucSlaveAddress, USHORT usRegStartA ucMBFrame[2] = (UCHAR)(usRegStartAddress); ucMBFrame[3] = (UCHAR)(ubNRegs >> 8); ucMBFrame[4] = (UCHAR)(ubNRegs); - - rt_kprintf("send frame [%x%x%x%x%x]\n", - ucMBFrame[0], ucMBFrame[1], ucMBFrame[2], ucMBFrame[3], ucMBFrame[4]); - - /* send request frame to slave device */ eStatus = eMBRTUSend( ucSlaveAddress, ucMBFrame, 5 ); /* wait on receive event */ if( xMBPortEventGet( &eEvent ) == TRUE ) { - eStatus = eMBRTUReceive( &ucRcvAddress, &ucMBFrame, &usLength ); + eStatus = eMBRTUReceive( &ucRcvAddress, &ucRcvFrame, &usLength ); + if( eStatus == MB_ENOERR ) { /* Check if the frame is for us. If not ignore the frame. */ if( ( ucRcvAddress == ucSlaveAddress ) || ( ucRcvAddress == MB_ADDRESS_BROADCAST ) ) { - /* parse and restore data */ - rt_kprintf("parse and restore date here\n"); + RT_ASSERT(ucRcvFrame[0] == MB_FUNC_READ_HOLDING_REGISTER); + RT_ASSERT(ucRcvFrame[1] == 2*ubNRegs) + + rt_memcpy((UCHAR *)arusBufferOut, &ucRcvFrame[2], 2*ubNRegs); } } } @@ -80,49 +79,43 @@ eMBErrorCode eMBMReadHoldingRegisters (UCHAR ucSlaveAddress, USHORT usRegStartA ** @note */ eMBErrorCode eMBMReadCoils (UCHAR ucSlaveAddress, USHORT usCoilStartAddress, - UBYTE ubNCoils, USHORT arusBufferOut[]) + UBYTE ubNCoils, UBYTE arusBufferOut[]) { static UCHAR ucMBFrame[5]; - eMBErrorCode eStatus = MB_ENOERR; - eMBEventType eEvent; - static UCHAR ucRcvAddress; - static USHORT usLength; + eMBErrorCode eStatus = MB_ENOERR; + eMBEventType eEvent; + static UCHAR ucRcvAddress; + static USHORT usLength; + UCHAR *ucRcvFrame; - /* make up request frame */ - ucMBFrame[0] = MB_FUNC_READ_COILS; - ucMBFrame[1] = (UCHAR)(usCoilStartAddress >> 8); - ucMBFrame[2] = (UCHAR)(usCoilStartAddress); - ucMBFrame[3] = (UCHAR)(ubNCoils >> 8); - ucMBFrame[4] = (UCHAR)(ubNCoils); + /* make up request frame */ + ucMBFrame[0] = MB_FUNC_READ_COILS; + ucMBFrame[1] = (UCHAR)(usCoilStartAddress >> 8); + ucMBFrame[2] = (UCHAR)(usCoilStartAddress); + ucMBFrame[3] = (UCHAR)(ubNCoils >> 8); + ucMBFrame[4] = (UCHAR)(ubNCoils); + /* send request frame to slave device */ + eStatus = eMBRTUSend( ucSlaveAddress, ucMBFrame, 5 ); - rt_kprintf("send frame [%x%x%x%x%x]\n", - ucMBFrame[0], ucMBFrame[1], ucMBFrame[2], ucMBFrame[3], ucMBFrame[4]); - - - /* send request frame to slave device */ - eStatus = eMBRTUSend( ucSlaveAddress, ucMBFrame, 5 ); - - /* wait on receive event */ - if( xMBPortEventGet( &eEvent ) == TRUE ) + /* wait on receive event */ + if( xMBPortEventGet( &eEvent ) == TRUE ) + { + eStatus = eMBRTUReceive( &ucRcvAddress, &ucRcvFrame, &usLength ); + if( eStatus == MB_ENOERR ) { - eStatus = eMBRTUReceive( &ucRcvAddress, &ucMBFrame, &usLength ); - if( eStatus == MB_ENOERR ) + /* Check if the frame is for us. If not ignore the frame. */ + if( ucRcvAddress == ucSlaveAddress ) { - /* Check if the frame is for us. If not ignore the frame. */ - if( ( ucRcvAddress == ucSlaveAddress ) || ( ucRcvAddress == MB_ADDRESS_BROADCAST ) ) - { - /* parse and restore data */ - rt_kprintf("parse and restore date here\n"); - } + RT_ASSERT(ucRcvFrame[0] == MB_FUNC_READ_COILS); + + rt_memcpy((UCHAR *)arusBufferOut, &ucRcvFrame[2], ucRcvFrame[1]); } } - else eStatus = MB_ETIMEDOUT; + } + else eStatus = MB_ETIMEDOUT; - return eStatus; + return eStatus; } - - - diff --git a/components/net/freemodbus/modbus/port/demo.c b/components/net/freemodbus/modbus/port/demo.c index 0f23325693..1ae81e4707 100644 --- a/components/net/freemodbus/modbus/port/demo.c +++ b/components/net/freemodbus/modbus/port/demo.c @@ -24,36 +24,36 @@ #include "mbproto.h" #include "mbfunc.h" - -USHORT buf[256]; - +#include "varible.h" void rt_modbus_thread_entry(void* parameter) { eMBErrorCode eStatus; - + USHORT buf[1]; + varible_group_t var_group; + + var_group = varible_group_get(); + eStatus = eMBInit( MB_RTU, 0x0A, 0, 115200, MB_PAR_EVEN ); /* Enable the Modbus Protocol Stack. */ - eStatus = eMBEnable( ); + eStatus = eMBEnable(); rt_thread_delay(50); while(1) { + int i = 0; - /* request holding reg */ - eMBMReadHoldingRegisters(0x0A, 0x1, 0x10, buf); - rt_kprintf("stop\n"); - rt_thread_delay(100); - /* request coils */ - eMBMReadCoils(0x0A, 0x1, 128, buf); - rt_thread_delay(100); + var_group->table->hash_table[]. + if(eMBMReadCoils(0x01, 0x0, 0x6, buf) != MB_ETIMEDOUT) - //while(1); + + + rt_thread_delay(100); } } -int modbus_demo_init(void) +int modbus_start(void) { rt_thread_t modbus_thread; diff --git a/components/net/freemodbus/modbus/port/portevent.c b/components/net/freemodbus/modbus/port/portevent.c index d048a28fb6..2033e9f902 100644 --- a/components/net/freemodbus/modbus/port/portevent.c +++ b/components/net/freemodbus/modbus/port/portevent.c @@ -33,15 +33,16 @@ BOOL xMBPortEventPost( eMBEventType eEvent ) { /* only care abot EV_FRAME_RECEIVED event */ if(eEvent == EV_FRAME_RECEIVED) + { rt_event_send(&event, 1<ucon = 0x245; /* Set uart0 bps */ UART1->ubrd = (rt_int32_t)(PCLK / (ulBaudRate * 16)) - 1; - + for (i = 0; i < 100; i++); SUBSRCPND |= BIT_SUB_RXD1; @@ -97,26 +97,25 @@ BOOL xMBPortSerialPutByte( CHAR ucByte ) BOOL xMBPortSerialGetByte( CHAR * pucByte ) { - while ((USTAT1 & USTAT_RCV_READY) == 0); - - *pucByte = URXB1; + while (!(USTAT1 & USTAT_RCV_READY)); + *pucByte = URXH1; + return TRUE; } static void rt_serial1_handler(int vector) { - if (SUBSRCPND & BIT_SUB_RXD1) { SUBSRCPND |= BIT_SUB_RXD1; prvvUARTRxISR(); } - if (SUBSRCPND & BIT_SUB_TXD1) - { + else if (SUBSRCPND & BIT_SUB_TXD1) + { SUBSRCPND |= BIT_SUB_TXD1; prvvUARTTxReadyISR(); - } + } } /* diff --git a/components/net/freemodbus/modbus/port/porttimer.c b/components/net/freemodbus/modbus/port/porttimer.c index 46c8af774f..3328af2d2d 100644 --- a/components/net/freemodbus/modbus/port/porttimer.c +++ b/components/net/freemodbus/modbus/port/porttimer.c @@ -33,14 +33,14 @@ BOOL xMBPortTimersInit(USHORT usTim1Timerout50us) TCFG1 &= 0xffff0fff; TCFG1 |= 0x00001000; - TCNTB3 = (rt_int32_t)(usTim1Timerout50us*(PCLK/ (4 *16* 20000))) - 1; + TCNTB3 = (rt_int32_t)(usTim1Timerout50us*(PCLK/ (4 *16* 1000))) - 1; /* manual update */ TCON = TCON & (~(0x0f<<16)) | (0x02<<16); /* install interrupt handler */ rt_hw_interrupt_install(INTTIMER3, prvvTIMERExpiredISR, RT_NULL); rt_hw_interrupt_umask(INTTIMER3); - /* start timer4, reload */ + /* start timer3, reload */ TCON = TCON & (~(0x0f<<16)) | (0x09<<16); return TRUE; diff --git a/components/net/freemodbus/modbus/rtu/mbrtu.c b/components/net/freemodbus/modbus/rtu/mbrtu.c index 0ba2d9fbbf..342f212b1a 100644 --- a/components/net/freemodbus/modbus/rtu/mbrtu.c +++ b/components/net/freemodbus/modbus/rtu/mbrtu.c @@ -207,8 +207,8 @@ eMBRTUSend( UCHAR ucSlaveAddress, const UCHAR * pucFrame, USHORT usLength ) /* Calculate CRC16 checksum for Modbus-Serial-Line-PDU. */ usCRC16 = usMBCRC16( ( UCHAR * ) pucSndBufferCur, usSndBufferCount ); - ucRTUBuf[usSndBufferCount++] = ( UCHAR )( usCRC16 & 0xFF ); - ucRTUBuf[usSndBufferCount++] = ( UCHAR )( usCRC16 >> 8 ); + pucSndBufferCur[usSndBufferCount++] = ( UCHAR )( usCRC16 & 0xFF ); + pucSndBufferCur[usSndBufferCount++] = ( UCHAR )( usCRC16 >> 8 ); /* Activate the transmitter. */ eSndState = STATE_TX_XMIT;