freemodbus-1.5版分享一下
单片机源程序如下:
- /*
- * FreeModbus Libary: MSP430 Demo Application
- * Copyright (C) 2006 Christian Walter <wolti@sil.at>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * File: $Id: demo.c,v 1.3 2006/11/19 15:22:40 wolti Exp $
- */
- /* ----------------------- Platform includes --------------------------------*/
- #include "port.h"
- #include "dco.h"
- /* ----------------------- Modbus includes ----------------------------------*/
- #include "mb.h"
- #include "mbport.h"
- /* ----------------------- Defines ------------------------------------------*/
- #define REG_INPUT_START 1000
- #define REG_INPUT_NREGS 4
- #define REG_HOLDING_START 1000
- #define REG_HOLDING_NREGS 130
- /* ----------------------- Static variables ---------------------------------*/
- static USHORT usRegInputStart = REG_INPUT_START;
- static USHORT usRegInputBuf[REG_INPUT_NREGS];
- static USHORT usRegHoldingStart = REG_HOLDING_START;
- static USHORT usRegHoldingBuf[REG_HOLDING_NREGS];
- /* ----------------------- Start implementation -----------------------------*/
- int
- main( void )
- {
- eMBErrorCode eStatus;
- volatile USHORT usACLKCnt;
- /* Stop Watchdog Timer. */
- WDTCTL = WDTPW + WDTHOLD;
- /* Delay for ACLK startup. */
- for( usACLKCnt = 0xFFFF; usACLKCnt != 0; usACLKCnt-- );
- if( cTISetDCO( TI_DCO_4MHZ ) == TI_DCO_NO_ERROR )
- {
- _EINT( );
- /* Initialize Protocol Stack. */
- if( ( eStatus = eMBInit( MB_RTU, 0x0A, 0, 38400, MB_PAR_EVEN ) ) != MB_ENOERR )
- {
- }
- /* Enable the Modbus Protocol Stack. */
- else if( ( eStatus = eMBEnable( ) ) != MB_ENOERR )
- {
- }
- else
- {
- for( ;; )
- {
- ( void )eMBPoll( );
- /* Here we simply count the number of poll cycles. */
- usRegInputBuf[0]++;
- }
- }
- }
- for( ;; );
- }
- eMBErrorCode
- eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
- {
- eMBErrorCode eStatus = MB_ENOERR;
- int iRegIndex;
- if( ( usAddress >= REG_INPUT_START )
- && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) )
- {
- iRegIndex = ( int )( usAddress - usRegInputStart );
- while( usNRegs > 0 )
- {
- *pucRegBuffer++ = ( unsigned char )( usRegInputBuf[iRegIndex] >> 8 );
- *pucRegBuffer++ = ( unsigned char )( usRegInputBuf[iRegIndex] & 0xFF );
- iRegIndex++;
- usNRegs--;
- }
- }
- else
- {
- eStatus = MB_ENOREG;
- }
- return eStatus;
- }
- eMBErrorCode
- eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode )
- {
- eMBErrorCode eStatus = MB_ENOERR;
- int iRegIndex;
- if( ( usAddress >= REG_HOLDING_START ) &&
- ( usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS ) )
- {
- iRegIndex = ( int )( usAddress - usRegHoldingStart );
- switch ( eMode )
- {
- /* Pass current register values to the protocol stack. */
- case MB_REG_READ:
- while( usNRegs > 0 )
- {
- *pucRegBuffer++ = ( unsigned char )( usRegHoldingBuf[iRegIndex] >> 8 );
- *pucRegBuffer++ = ( unsigned char )( usRegHoldingBuf[iRegIndex] & 0xFF );
- iRegIndex++;
- usNRegs--;
- }
- break;
- /* Update current register values with new values from the
- * protocol stack. */
- case MB_REG_WRITE:
- while( usNRegs > 0 )
- {
- usRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8;
- usRegHoldingBuf[iRegIndex] |= *pucRegBuffer++;
- iRegIndex++;
- usNRegs--;
- }
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
freemodbus-v1.5官网支持stm32.zip
(4.16 MB, 下载次数: 142)
|