【嵌入式】Libmodbus之RTU模式Slave端程序示例
发布日期:2021-06-29 20:52:07 浏览次数:2 分类:技术文章

本文共 1661 字,大约阅读时间需要 5 分钟。

00. 目录

文章目录

01. 开发RTU Slave端程序流程

在这里插入图片描述

02. RTU Slave端程序示例

程序示例

#include 
#ifndef _MSC_VER#include
#endif#include
#include
#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. 附录

源程序下载:

转载地址:https://dengjin.blog.csdn.net/article/details/116797671 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【嵌入式】Libmodbus之TCP模式Master端程序示例
下一篇:【嵌入式】Libmodbus之RTU模式Master端程序示例

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月05日 18时02分31秒