rt thread中libmodbus 在使用多从机时无法读取信息的问题

关于rtthread中libmodbus多从机无法读取信息的解决方案


关于rtthread中libmodbus多从机无法读取信息的解决方案,本人测试了两台从机下的情况,发现单独的读取每个从机都没有问题,把两台从机并在一起就会出现问题,只能读取其中的一台,读取哪台是随机的。

问题解决

  • modbus-rtu-private.hmodbus_rtu_t的结构体中加上int confirmation_to_ignore;
typedef struct _modbus_rtu {
    /* Device: "/dev/ttyS0", "/dev/ttyUSB0" or "/dev/tty.USA19*" on Mac OS X. */
    char *device;
    /* Bauds: 9600, 19200, 57600, 115200, etc */
    int baud;
    /* Data bit */
    uint8_t data_bit;
    /* Stop bit */
    uint8_t stop_bit;
    /* Parity: 'N', 'O', 'E' */
    char parity;
#if defined(_WIN32)
    struct win32_ser w_ser;
    DCB old_dcb;
#else
    /* Save old termios settings */
    struct termios old_tios;
#endif
#if HAVE_DECL_TIOCSRS485
    int serial_mode;
#endif
#if HAVE_DECL_TIOCM_RTS
    int rts;
    int rts_delay;
    int onebyte_time;
    int rts_pin;
    void (*set_rts) (modbus_t *ctx, int on);
#endif

	 /* To handle many slaves on the same link */
    int confirmation_to_ignore; //这是新增的一条,其他不动
} modbus_rtu_t;
  • modbus-rtu.c_modbus_rtu_receive(void) 函数修改为以下
static int _modbus_rtu_receive(modbus_t *ctx, uint8_t *req)
{
    int rc;
	modbus_rtu_t *ctx_rtu = ctx->backend_data;
	if (ctx_rtu->confirmation_to_ignore) {
        _modbus_receive_msg(ctx, req, MSG_CONFIRMATION);
        /* Ignore errors and reset the flag */
        ctx_rtu->confirmation_to_ignore = FALSE;
        rc = 0;
        if (ctx->debug) {
            printf("Confirmation to ignore\n");
        }
    } else {
        rc = _modbus_receive_msg(ctx, req, MSG_INDICATION);
        if (rc == 0) {
            /* The next expected message is a confirmation to ignore */
            ctx_rtu->confirmation_to_ignore = TRUE;
        }
    }
	
	return rc;
}
  • 测试
    在这里插入图片描述

修改之后可以看到,两台设备都没有问题,并且以10ms的速度扫描了一个晚上也没有出现异常,libmodbus还是非常稳定的。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
​ 概述: 多点传感器采集子系统是用基于STM32系类芯片STM32H750开发板ART-Pi开发,支持无线采集多种传感器数据,子系统收集数据后通过无线网络上传分站。访问该子系统时会展示一个网页显示本系统采集到的传感器数据。该系统适用与工业现场各种传感器数据收集转储,可以用在传感器较多的场景。 开发环境 硬件:ART-Pi主板 扩展板:ESP8266 WIFI模块 RT-Thread版本:RT-Thread V 4.0.3 开发工具及版本:RT-Thread Studio 2.0.0 RT-Thread使用情况概述 内核部分:调度器,信号量,消息队列。 调度器:创建多个线程来实现不同的工作。 信号量:用来同步线程。 消息队列:用来实现线程之间传递的数据。 组件部分:SPI框架,Sensor框架,SAL套接字抽象层 软件包部分: Webnet:建立一个简单Web服务器,提供数据显示界面。 cJSON:C语言实现的极简的解析JSON格式的软件包。 TFTP:上传配置数据,网页文件等。 MicroPython:逻辑实现的主要部分。实现与ESP8266的连接以传输收集的传感器数据。还要实现对展示数据的网页的动态生成。 硬件框架 将接收到ESP8266的数据转储后传输到分站上位机。 软件框架 软件框架说明 本项目使用2个线程,其一个负责基于ESP8266的采集板通过发送UDP数据包给ARIT-Pi获得传感器数据,另一个线程负责根据数据池的数据生成动态网页并上传数据。 第一部分:数据接收线程 此线程负责接收由基于ESP8266的采集板发送来的UDP数据。并储存在数据池内。 第二部分:网页生成线程 另一个线程负责从数据池内提取数据,并根据数据生成网页供展示传感器数据。然后将接收到ESP8266的数据转储后传输到分站上位机。 软件模块说明 server_run:接收UDP数据包线程,提取有用传感器数据,保存在数据池。 web_run:根据采集到的数据生成网页文件,并保存在/flash/webnet目录下。然后将数据上传至上位机。 main:负责led闪烁,用来显示当前系统的运行状态。 演示效果 从传感器传来的数据是随时变化的。 使用的材料其实也很简单,就是一个ART-Pi主板和一个ESP8266模块。 视频观看: 比赛感悟 通过这次实践,我学习了RT-Thread操作系统的裁剪和各种组件和软件包的搭配使用。在过程学到了许多以前没有接触过的知识,也对RT-Thread RTOS也有了新的认识。对这种小操作系统能做到这样的程度感到非常吃惊。这让我以后使用该系统更有底气。 RT-Thread的软件包非常丰富,我在这个小操作系统上找到了需要的web服务器、TFTP服务器、socket组件,令人意外的是集成了MicroPython,而且在MicroPython支持re和json,可以快速开发应用,不用每一次修改程序都重新烧写一遍芯片。但是我在试图使用动态模块时却不顺利,这让我对这种操作系统的配置复杂性有一点却步,感觉上手有一点难,其实还可以做的更好一些。 最后感谢主办方提供了这么好的一个平台,让我学到了许多RT-Thread操作系统的特性。通过这次的实践我对RT-Thread的许多特性有了了解,并且感受到此产品在工程开发上提供的许多便利性,我会在以后的作品更多的使用RT-Thread产品,也会向朋友推荐这款产品。 ​

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值