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

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

通过从modbus.org读取规范,我熟悉协议(关于PDU ADU帧,function代码,主从)。 但是在C中编写代码时,我在实现上遇到了困难。

所以我的问题是:

  1. 我在开始连接时是否必须打开连接,设置波特率等?
  2. 我想将帧发送为byte []。 它是否正确? 或者还有其他方法吗?
  3. 数据发送必须是hex,还是二进制或整数?
  4. CRC生成和检查。

我将非常感谢所有的帮助和帮助:)对不起,如果问题不是非常具体或太基础

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

第二步:在你的硬件上运行计时器。 Modbus协议对时序有一些要求,所以你也需要它。

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

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

首先:是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(小端)。

在此处输入图像描述

  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> 1) & 0x7FFF; if (Bit) CRC_REGISTER = CRC_REGISTER ^ CONSTANT; } } return CRC_REGISTER; }