Rtthread学习笔记(十七)添加freemodbus主机遇到写数据成功,读数据失败

23 篇文章 77 订阅

解决办法:将原来115200的波特率修改为19200,然后主机读数据成功。

一、modbus主机读数据失败现象

添加freemodbus主机的时候遇到了奇怪的问题,记录下来。先说明一下情况,前两天按照RT例程把freemodbus主机移植完毕,添加modbus主机
并且与上位机modbus slave从机的写指令(10)通讯成功,把数据实时写进了上位机从机,然后想起来忘记测试读指令(03)通讯是否成功,便测试了一下,结果通讯不成功,代码效果如下:
在这里插入图片描述

extern USHORT usMRegHoldBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_REG_HOLDING_NREGS];
static void send_thread_entry(void *parameter)
{
    eMBMasterReqErrCode error_code = MB_MRE_NO_ERR;
    rt_uint16_t error_count = 0;
    //USHORT data[3] = {0};
    while (1)
    {   //读取从机
        error_code = eMBMasterReqReadHoldingRegister(SLAVE_ADDR, MB_SEND_REG_START,4,RT_WAITING_FOREVER);//读多个保持寄存器
        rt_kprintf("error_code: %d \n",error_code);//一直出错,我便把错误返回值打印出来
        rt_kprintf("%d,%d,%d,%d,%d\n\r",usMRegHoldBuf[0][1],usMRegHoldBuf[0][2],usMRegHoldBuf[0][3],usMRegHoldBuf[0][4],usMRegHoldBuf[0][5]);//0代表从机ID=1
        rt_thread_mdelay(1000);
        /* Record the number of errors */
        if (error_code != MB_MRE_NO_ERR)
        {
            error_count++;
        }
    }
}

此时的波特率为115200,然后就出现了如下的现象,检测主机发送间隔大于1s,从机回应及时且数据正确,但主机就是反馈错误代码3(表示接收数据错误)。
在这里插入图片描述
在这里插入图片描述
调试了好多内容依旧如此,便决定修改一下波特率试试,先修改为9600,上位机同时修改为9600,结果程序便卡在读保持寄存器函数中最后的等待回应函数中。
在这里插入图片描述
在这里插入图片描述

二、尝试解决办法

无奈了再试试19200这个波特率吧,其他都保持不变8N1。结果就通讯成功了,主机通讯成功了。
在这里插入图片描述
在这里插入图片描述
既然通讯成功了,就再试试写数据是否成功吧。结果在这个波特率下读写都正常。
在这里插入图片描述
这能是哪里的原因的,就目前这个现象来看,应该是程序判断一帧结束的标准出现了问题,在115200时总是数据接收出错,在9600就一直等待接收回应,也有可能是周边环境干扰。
出于好奇心,看看是不是就只有串口2(用于modbus主机)这样子呢,便换到串口4试一下。
在这里插入图片描述
在这里插入图片描述
暂时没找到根本原因,就先按照修改波特率为19200的方式使用这个读功能,有哪位大神请留言指点一下。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
RT-Thread是一款基于实时操作系统(RTOS)的开源嵌入式操作系统。它支持多种硬件平台,并提供丰富的软件组件和协议栈,其中包括FreeMODBUSFreeMODBUS是一个开源的MODBUS协议栈实现,用于实现MODBUS通信。 在RT-Thread中,可以使用FreeMODBUS实现MODBUS主机功能。MODBUS是一种通信协议,常用于工业自动化领域,用于在不同的设备之间进行数据通信。MODBUS主机是指在通信中起主导作用的设备,它可以发起请求并处理响应,与其他设备进行通信。 使用RT-ThreadFreeMODBUS主机,我们可以通过编代码来实现MODBUS通信功能。首先,我们需要初始化MODBUS主机,并设置相关的通信参数,例如波特率、数据位等。然后,我们可以使用MODBUS主机发送请求给其他设备,例如读取或数据主机会发送相应的请求帧,并等待其他设备的响应。一旦收到响应,我们可以解析响应帧中的数据,并进行相应的处理。 RT-ThreadFreeMODBUS主机还提供了丰富的API函数,用于实现各种MODBUS功能。例如,可以使用API函数设置寄存器的值,读取输入寄存器的值,或者发送自定义的MODBUS请求。通过这些API函数,我们可以根据实际需求进行灵活的开发。 总而言之,RT-ThreadFreeMODBUS主机提供了一种简便有效的方式来实现MODBUS通信功能。无论是在工业自动化领域还是其他领域,使用该主机可以快速实现设备之间的数据通信。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值