用于嵌入式系统lpcxpresso的C语言中的Modbus实现

时间:2015-01-22 07:42:24

标签: c embedded modbus

我是modbus的新手,我必须将lpcxpresso基板编程为主机,以便使用RS485 Modbus协议从功率计收集读数。

通过阅读modbus.org的规范,我熟悉协议(关于PDU ADU帧,功能代码,主从)。 但是,在使用C语言编写代码时,我在实现方面遇到了困难。

所以我的问题是:

  1. 我在开始连接时是否必须打开连接,设置波特率等?
  2. 我想将帧发送为byte []。它是否正确?还是有其他办法吗?
  3. 数据发送必须是十六进制,还是二进制或整数?
  4. CRC生成和检查。
  5. 我将非常感谢所有的帮助和帮助:)对不起,如果问题不是非常具体或太基本

2 个答案:

答案 0 :(得分:2)

步骤1:暂时忘掉能量计和modbus。最重要的是让硬件正常工作。 RS485只是一个串口。阅读有关如何初始化硬件上的串行端口的手册,并将单字节发送到PC并返回。然后将数百个字节发送到PC并返回。

Setp 2:也可以在你的硬件上使用计时器。 Modbus协议对时序有一些要求,所以你也需要它。

第3步:获取modbus规范。它将解释协议格式和校验和。使用modbus库或编写自己的库。在进入电能表之前,请确保可以使用PC。

第4步:如果您遇到问题,请在SO上询问有关它的具体问题。

答案 1 :(得分:1)

首先:是ModBus RTu还是ASCII?

  1. 是的,当然。您需要按照规范描述指定所有内容。
  2. 是的,它是一个unsigned char []。该结构由规格描述。
  3. 这个问题没有意义:你总是发送信息作为“记忆 转储“,但是对于RTU,每个内存字节发送1个字节,如果是 ASCII每个内存字节发送2个字节。例如。如果你必须发送一个 字节0xAE:RTU = 0xAE - ASCII = 0x41 0x45。在RTU的情况下,如果你必须发送一个int(4字节),你将发送这些字节,因为它们存储在内存中,例如:12345将发送为0x00 0x00 0x30 0x39(大端),0x39 0x30 0x00 0x00(小端)。
  4. enter image description here

    1. CRC的计算在规格中说明。在我的旧CBuilder组件的代码下面
    2. unsigned short TLPsComPort :: Calculate_CRC16(int Message_Length,char * Message

      {

          char Low_CRC;
          char Bit;
         // Constant of ModBus protocol
         unsigned short CONSTANT     = 0xA001;
         unsigned short CRC_REGISTER = 0xFFFF;
      
         for (int i=0; i<Message_Length; i++)
         {
            Low_CRC = CRC_REGISTER;
            Low_CRC = *(Message+i) ^ Low_CRC;
            CRC_REGISTER =  ((CRC_REGISTER & 0xFF00) | (Low_CRC & 0x00FF));
            for (int j=0; j<8;j++)
            {                                                                    
               Bit = CRC_REGISTER & 0x0001;
               CRC_REGISTER = (CRC_REGISTER >> 1) & 0x7FFF;
               if (Bit) CRC_REGISTER = CRC_REGISTER ^ CONSTANT;
            }
         }
      
         return CRC_REGISTER;
      }