mbutils.c
上传用户:kongshuqi
上传日期:2013-10-09
资源大小:59k
文件大小:4k
源码类别:

通讯编程

开发平台:

Visual C++

  1.  /*
  2.   * FreeRTOS Modbus Libary: A Modbus serial implementation for FreeRTOS
  3.   * Copyright (C) 2006 Christian Walter <wolti@sil.at>
  4.   *
  5.   * This library is free software; you can redistribute it and/or
  6.   * modify it under the terms of the GNU Lesser General Public
  7.   * License as published by the Free Software Foundation; either
  8.   * version 2.1 of the License, or (at your option) any later version.
  9.   *
  10.   * This library is distributed in the hope that it will be useful,
  11.   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.   * Lesser General Public License for more details.
  14.   *
  15.   * You should have received a copy of the GNU Lesser General Public
  16.   * License along with this library; if not, write to the Free Software
  17.   * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  18.   */
  19. /* ----------------------- System includes ----------------------------------*/
  20. #include "stdlib.h"
  21. #include "string.h"
  22. /* ----------------------- Platform includes --------------------------------*/
  23. #include "port.h"
  24. /* ----------------------- Modbus includes ----------------------------------*/
  25. #include "mb.h"
  26. #include "mbproto.h"
  27. /* ----------------------- Defines ------------------------------------------*/
  28. #define BITS_UCHAR      8U
  29. /* ----------------------- Start implementation -----------------------------*/
  30. void
  31. xMBUtilSetBits( UCHAR * ucByteBuf, USHORT usBitOffset, UCHAR ucNBits,
  32.                 UCHAR ucValue )
  33. {
  34.     USHORT          usWordBuf;
  35.     USHORT          usMask;
  36.     USHORT          usByteOffset;
  37.     USHORT          usNPreBits;
  38.     USHORT          usValue = ucValue;
  39.     assert( ucNBits <= 8 );
  40.     assert( ( size_t )BITS_UCHAR == sizeof( UCHAR ) * 8 );
  41.     /* Calculate byte offset for first byte containing the bit values starting
  42.      * at usBitOffset. */
  43.     usByteOffset = ( USHORT )( ( usBitOffset ) / BITS_UCHAR );
  44.     /* How many bits precede our bits to set. */
  45.     usNPreBits = ( USHORT )( usBitOffset - usByteOffset * BITS_UCHAR );
  46.     /* Move bit field into position over bits to set */
  47.     usValue <<= usNPreBits;
  48.     /* Prepare a mask for setting the new bits. */
  49.     usMask = ( USHORT )( ( 1 << ( USHORT ) ucNBits ) - 1 );
  50.     usMask <<= usBitOffset - usByteOffset * BITS_UCHAR;
  51.     /* copy bits into temporary storage. */
  52.     usWordBuf = ucByteBuf[usByteOffset];
  53.     usWordBuf |= ucByteBuf[usByteOffset + 1] << BITS_UCHAR;
  54.     /* Zero out bit field bits and then or value bits into them. */
  55.     usWordBuf = ( usWordBuf & ( ~usMask ) ) | usValue;
  56.     /* move bits back into storage */
  57.     ucByteBuf[usByteOffset] = ( UCHAR )( usWordBuf & 0xFF );
  58.     ucByteBuf[usByteOffset + 1] = usWordBuf >> BITS_UCHAR;
  59. }
  60. UCHAR
  61. xMBUtilGetBits( UCHAR * ucByteBuf, USHORT usBitOffset, UCHAR ucNBits )
  62. {
  63.     USHORT          usWordBuf;
  64.     USHORT          usMask;
  65.     USHORT          usByteOffset;
  66.     USHORT          usNPreBits;
  67.     /* Calculate byte offset for first byte containing the bit values starting
  68.      * at usBitOffset. */
  69.     usByteOffset = ( USHORT )( ( usBitOffset ) / BITS_UCHAR );
  70.     /* How many bits precede our bits to set. */
  71.     usNPreBits = ( USHORT )( usBitOffset - usByteOffset * BITS_UCHAR );
  72.     /* Prepare a mask for setting the new bits. */
  73.     usMask = ( USHORT )( ( 1 << ( USHORT ) ucNBits ) - 1 );
  74.     /* copy bits into temporary storage. */
  75.     usWordBuf = ucByteBuf[usByteOffset];
  76.     usWordBuf |= ucByteBuf[usByteOffset + 1] << BITS_UCHAR;
  77.     /* throw away unneeded bits. */
  78.     usWordBuf >>= usNPreBits;
  79.     /* mask away bits above the requested bitfield. */
  80.     usWordBuf &= usMask;
  81.     return ( UCHAR ) usWordBuf;
  82. }
  83. eMBException
  84. prveMBError2Exception( eMBErrorCode eErrorCode )
  85. {
  86.     eMBException    eStatus;
  87.     switch ( eErrorCode )
  88.     {
  89.         case MB_ENOERR:
  90.             eStatus = MB_EX_NONE;
  91.             break;
  92.         case MB_ENOREG:
  93.             eStatus = MB_EX_ILLEGAL_DATA_ADDRESS;
  94.             break;
  95.         case MB_ETIMEDOUT:
  96.             eStatus = MB_EX_SLAVE_BUSY;
  97.             break;
  98.         default:
  99.             eStatus = MB_EX_SLAVE_DEVICE_FAILURE;
  100.             break;
  101.     }
  102.     return eStatus;
  103. }