用485总线,modbus协议通讯,移植完了不会用,网上看的程序也糊里糊涂的

2019-07-14 20:31发布

大家好,本人用的板子是STM32vet6,用到modbus通讯,但是初次接触modbus,modbus的文档也看了不少,但是程序里不知道怎么写来实现modbus的强大功能,目前我想先用modbus先实现接受和发送数据,但是不知道代码是怎样的,求大家能指导一下,或者大家有做过modbus这一块的,希望可以分享一下经验或者资料,感激不尽,帮助小白我,谢谢谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
jianfeii
1楼-- · 2019-07-15 22:59
 精彩回答 2  元偷偷看……
曾小z
2楼-- · 2019-07-15 23:18
meimengxing2014 发表于 2016-8-16 12:29
可以把代码贴上来,把不懂得地方标注下,然后大家一起讨论

有乱码的地方是注释汉字,显示不出来,这是我网上看别人移植完的程序,main函数里都有这些函数,不写会报错,里面也没有校验什么的,看不懂啊看不懂,我是不是太菜了,本人大二
eMBErrorCode
eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils,
               eMBRegisterMode eMode )
{
  //´íÎó״̬
  eMBErrorCode    eStatus = MB_ENOERR;
  //¼Ä´æÆ÷¸öÊý
  int16_t         iNCoils = ( int16_t )usNCoils;
  //¼Ä´æÆ÷Æ«ÒÆÁ¿
  int16_t         usBitOffset;

  //¼ì²é¼Ä´æÆ÷ÊÇ·ñÔÚÖ¸¶¨·¶Î§ÄÚ
  if( ( (int16_t)usAddress >= REG_COILS_START ) &&
        ( usAddress + usNCoils <= REG_COILS_START + REG_COILS_SIZE ) )
  {
    //¼ÆËã¼Ä´æÆ÷Æ«ÒÆÁ¿
    usBitOffset = ( int16_t )( usAddress - REG_COILS_START );
    switch ( eMode )
    {
      //¶Á²Ù×÷
      case MB_REG_READ:
        while( iNCoils > 0 )
        {
          *pucRegBuffer++ = xMBUtilGetBits( ucRegCoilsBuf, usBitOffset,
                                          ( uint8_t )( iNCoils > 8 ? 8 : iNCoils ) );
          iNCoils -= 8;
          usBitOffset += 8;
        }
        break;

      //д²Ù×÷
      case MB_REG_WRITE:
        while( iNCoils > 0 )
        {
          xMBUtilSetBits( ucRegCoilsBuf, usBitOffset,
                        ( uint8_t )( iNCoils > 8 ? 8 : iNCoils ),
                        *pucRegBuffer++ );
          iNCoils -= 8;
        }
        break;
    }

  }
  else
  {
    eStatus = MB_ENOREG;
  }
  return eStatus;
}

eMBErrorCode
eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )
{
  //´íÎó״̬
  eMBErrorCode    eStatus = MB_ENOERR;
  //²Ù×÷¼Ä´æÆ÷¸öÊý
  int16_t         iNDiscrete = ( int16_t )usNDiscrete;
  //Æ«ÒÆÁ¿
  uint16_t        usBitOffset;

  //ÅжϼĴæÆ÷ʱºòÔÙÖƶ¨·¶Î§ÄÚ
  if( ( (int16_t)usAddress >= REG_DISCRETE_START ) &&
        ( usAddress + usNDiscrete <= REG_DISCRETE_START + REG_DISCRETE_SIZE ) )
  {
    //»ñµÃÆ«ÒÆÁ¿
    usBitOffset = ( uint16_t )( usAddress - REG_DISCRETE_START );
   
    while( iNDiscrete > 0 )
    {
      *pucRegBuffer++ = xMBUtilGetBits( ucRegDiscreteBuf, usBitOffset,
                                      ( uint8_t)( iNDiscrete > 8 ? 8 : iNDiscrete ) );
      iNDiscrete -= 8;
      usBitOffset += 8;
    }

  }
  else
  {
    eStatus = MB_ENOREG;
  }
  return eStatus;
}[/code]
曾小z
3楼-- · 2019-07-16 04:58
jianfeii 发表于 2016-8-16 15:50
串口助手可以用啊,你就是把串口助手当主机,单片机下面跑从机程序,串口发送查询命令,或者修改寄存器的值,然后看从机返回的数据对不对.

问题是我只是移植了modbus,功能码还有接受发送函数都没写啊,不知道代码是怎样的,从机程序没写好没法跑呢,我在想modbus是不是有专门的发送接收函数,不像485这样写个USART_SendData();就可以,网上的资料貌似也不多啊,你有没有测试成功的代码呢
曾小z
4楼-- · 2019-07-16 08:45
meimengxing2014 发表于 2016-8-16 12:29
可以把代码贴上来,把不懂得地方标注下,然后大家一起讨论

我从网上下了好多modbus的代码,有些有crc校验,有些没有,有点无助了,代码都不一样,函数是自己定义的,还是modbus协议里自带的呢,本来想用来传输ds18B20的温度的,但是测试代码都不会啊大哥
meimengxing2014
5楼-- · 2019-07-16 08:55
现在有点晚了,明天我把0x10和0x03指令给你讲一下吧
meimengxing2014
6楼-- · 2019-07-16 10:56
 精彩回答 2  元偷偷看……

一周热门 更多>