嵌入式Libmodbus之RTU模式Slave端程序示例
Posted 沧海一笑-dj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式Libmodbus之RTU模式Slave端程序示例相关的知识,希望对你有一定的参考价值。
00. 目录
01. 开发RTU Slave端程序流程
02. RTU Slave端程序示例
程序示例
#include <stdio.h>
#ifndef _MSC_VER
#include <unistd.h>
#endif
#include <stdlib.h>
#include <errno.h>
#include "modbus.h"
//从站地址 17
#define SERVER_ID 17
//RTU模式的Slave端程序
int main(void)
{
int ret = 0;
modbus_t* ctx = NULL;
modbus_mapping_t* map = NULL;
uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];
//1. 设置串口信息
ctx = modbus_new_rtu("COM3", 9600, 'N', 8, 1);
if (NULL == ctx)
{
fprintf(stderr, "Error: %s\\n", modbus_strerror(errno));
return 1;
}
else
{
printf("设置串口信息成功\\n");
}
//2. 设置从机地址
ret = modbus_set_slave(ctx, SERVER_ID);
if (-1 == ret)
{
printf("设置从机地址失败.. %s\\n", modbus_strerror(errno));
modbus_free(ctx);
return 1;
}
//设置调试模式
ret = modbus_set_debug(ctx, TRUE);
if (-1 == ret)
{
printf("modbus_set_debug failed...\\n");
modbus_free(ctx);
return 1;
}
//3. 打开串口
ret = modbus_connect(ctx);
if (-1 == ret)
{
fprintf(stderr, "打开串口失败: %s\\n", modbus_strerror(errno));
modbus_free(ctx);
return 1;
}
//4. 申请内存 存放寄存器数据
map = modbus_mapping_new(500, 500, 500, 500);
if (NULL == map)
{
fprintf(stderr, "Error: mapping %s\\n", modbus_strerror(errno));
modbus_free(ctx);
return 1;
}
//5. 循环接受客户端请求,并且响应客户端
while (1)
{
memset(query, 0, sizeof(query));
//获取查询请求报文
ret = modbus_receive(ctx, query);
if (ret >= 0)
{
//恢复响应报文
modbus_reply(ctx, query, ret, map);
}
else
{
printf("Connection close\\n");
}
}
printf("Quit the loop: %s\\n", modbus_strerror(errno));
//6. 释放内存
modbus_mapping_free(map);
//7. 关闭设备
modbus_close(ctx);
modbus_free(ctx);
return 0;
}
执行结果
03. RTU Slave端程序说明
先启动Slave端程序,然后在启动Master端程序。同时要使用虚拟串口设备虚拟串口。
04. 预留
05. 附录
源程序下载:RTU模式Slave端程序.rar
以上是关于嵌入式Libmodbus之RTU模式Slave端程序示例的主要内容,如果未能解决你的问题,请参考以下文章
基于libmodbus库实现modbus TCP/RTU通信