基于libmodbus 开发RTU Master端测试程序
开发环境
- 编译软件:VS2019
- libmodbusbus库:3.1.6版本 下载地址:https://libmodbus.org/download/
完整代码
//******************************************************************************
//name: TestRtuSlave.cpp
//introduce: 串口Modbus-RTU Master(主机)测试代码
//author: szq
//changetime: 2019.8.13
//******************************************************************************
/*********************************************************************
* INCLUDES
*/
#include <stdio.h>
#ifndef _MSC_VER
include <unistd.h>
#endif
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include "modbus.h" //应用libmodbus库
/*All these functions arre called with random values on a address range defined by the following defines.
* 所有这些函数都是在以下定义的地址范围内使用随机值调用的。
*/
#define SERVER_ID 17 //从端设备地址
/*At each loop,the program works in the range ADDRESS_START to
* ADDRESS_END then ADDRESS_START+1 to ADDRESS_END and so on.
*/
int main(void)
{
modbus_t* ctx;
modbus_mapping_t* mb_mapping;
system("title C++ modbus-RTU 测试程序");//设置cmd窗口标题
system("mode con cols=48 lines=25");//窗口宽度高度
system("color 0B");//0背景色黑色 B前景色浅绿色
system("date /T");//输出当前日期时间
system("TIME /T");
printf(" ╪╪╪╪╪╪╧╧╧╧╧╧╧╧╪╪╪╪╪╪\n");
printf("╔═╧╧ C++ modbus-RTU TEST CODE ╧╧═╗\n");
printf("║※1. ║\n");
printf("║※2. ║\n");
printf("║※3. ║\n");
printf("║※0. ║\n");
printf("╚═══════════════════╝\n");
Sleep(1000);//延时1秒
/* RTU */
ctx = modbus_new_rtu("COM4", 9600, 'N', 8, 1); //创建一个RTU类型的容器,即创建一个COM口为C0M4 波特率9600bit/s
modbus_set_slave(ctx, SERVER_ID); //设置从机地址
modbus_set_debug(ctx, TRUE); //设置debug模式
if (modbus_connect(ctx) == -1)
{
fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
modbus_free(ctx);
return -1;
}
//申请4块内存区用以存放寄存器数据,这里各申请500个寄存器地址
mb_mapping = modbus_mapping_new(500, 500, 500, 500);
if (mb_mapping == NULL)
{
fprintf(stderr,"Error mapping:%s\n", modbus_strerror(errno));
modbus_free(ctx);
return -1;
}
//循环接收查询帧并回复消息
for (;;)
{
uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];
int rc;
rc = modbus_receive(ctx, query);
if (rc >= 0)
{
/*rc is the query size*/
modbus_reply(ctx, query, rc, mb_mapping);
}
else
{
//connection closed by the client or error
printf("Connection Closed\n");
}
}
printf("Quit the loop:%s\n", modbus_strerror(errno));
//释放内存
modbus_mapping_free(mb_mapping);
modbus_close(ctx);
modbus_free(ctx);
return 0;
}
配合上一篇博客写的Master端测试程序测试 测试运行演示

版权声明:本文为u013422297原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。