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

5jvtdoz2  于 2023-04-19  发布在  其他
关注(0)|答案(2)|浏览(139)

我是Modbus的新手,我必须将LPCXpresso基板编程为主机,以使用RS485 Modbus协议从功率计收集读数。
通过阅读modbus.org上的规范,我对协议(PDU ADU帧、功能代码、主从)比较熟悉,但在用C语言编写代码时,在实现上遇到了困难。
所以我的问题是
1.当我开始连接时,我必须打开连接,设置波特率等吗?
1.我想以byte[]的格式发送帧。这是正确的吗?或者还有其他方法吗?
1.发送的数据必须是十六进制、二进制还是整数?

  1. CRC生成和校验。
    我真的很感激所有的帮助和援助:)对不起,如果问题不是很具体或太基本
hvvq6cgz

hvvq6cgz1#

步骤1:现在忘记电能表和Modbus。最重要的是让硬件工作。RS485只是一个串行端口。阅读手册如何在硬件上初始化串行端口,并将单个字节发送到PC并返回。然后将数百个字节发送到PC并返回。
设置2:让硬件上的定时器也工作。Modbus协议对定时有一些要求,所以你也需要它。
步骤3:获取modbus规范。它将解释协议格式和校验和。使用modbus库或编写自己的。确保您可以在PC上使用它,然后再转到电表。
第四步:如果你有问题,在SO上提出具体的问题。

b4lqfgs4

b4lqfgs42#

首先:ModBus是RTU还是ASCII?
1.是的,当然。你需要把所有的东西都按说明书上的描述详细说明。
1.是的,它是一个unsigned char[]。结构由规范描述。
1.这个问题没道理你总是发送信息作为“内存转储”,但与RTU你发送1字节每内存字节,在ASCII的情况下,你发送2字节每内存字节。例如。如果你必须发送一个字节0xAE:RTU=0xAE - ASCII= 0x 41 0x 45。在RTU的情况下,如果您必须发送一个int(4字节),您将发送存储在内存中的这些字节,例如:12345将被发送为0x 00 0x 00 0x 30 0x 39(大端),0x 39 0x 30 0x 00 0x 00(小端)。

  1. CRC的计算在规范中有解释。下面是我的旧CBuilder组件的代码
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;
    }

相关问题