RT-Thread FreeModbus的简单使用

1、开启串口

这边我用到的是串口3,可以自己配置其他的串口

    menuconfig BSP_USING_UART
        bool "Enable UART"
        default y
        select RT_USING_SERIAL
        if BSP_USING_UART
            config BSP_USING_UART3
                bool "Enable UART3"
                default y
        endif

2、在ENV中打开FreeModbus

在这里插入图片描述
在IOT软件包中找到freemodbus,我这边选择了master mode。
选项解释
enable RTU master mode :选择RTU模式也就是每个字节是传输2个十六进制字符。
use contorl pin:选择是否开启控制引脚,控制引脚也就是控制传输的方向TX和RX,比如MAX3485芯片就需要这个引脚进行控制。
pin index for rs485 tx/rx select:控制引脚的端口号
enable master sample :开启主模式的例程
test slave device address:从机的设备地址
uart number used by master sample:串口号
uart baudrate used by master sample:波特率

3、测试

重新编译工程后,在finsh中输入mb_master_samlpe,就可以开启send_thread_entry实体进行测试。

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[2] = {0};
		rt_kprintf("send_thread_entry is running\n");
		rt_kprintf("SLAVE_ADDR:%d,MB_SEND_REG_START:%d,MB_SEND_REG_NUM:%d\n",SLAVE_ADDR,MB_SEND_REG_START,MB_SEND_REG_NUM);
    while (1)
    {
        /* Test Modbus Master */
        data[0] = (USHORT)(rt_tick_get() / 10);
        data[1] = (USHORT)(rt_tick_get() % 10);
//        error_code = eMBMasterReqWriteMultipleHoldingRegister(SLAVE_ADDR,          /* salve address */
//                                                              MB_SEND_REG_START,   /* register start address */
//                                                              MB_SEND_REG_NUM,     /* register total number */
//                                                              data,                /* data to be written */
//                                                              RT_WAITING_FOREVER); /* timeout */
				eMBMasterReqReadHoldingRegister(SLAVE_ADDR,          /* salve address */
																				MB_SEND_REG_START,   /* register start address */
																				MB_SEND_REG_NUM,     /* register total number */
																				RT_WAITING_FOREVER); /* timeout */
			rt_kprintf("data:\n");
			for(i=0;i<4;i++)
			{
				rt_kprintf("%d\n",usMRegHoldBuf[2][i]);
			}
        /* Record the number of errors */
        if (error_code != MB_MRE_NO_ERR)
        {
            error_count++;
        }
    }
}

我在开始调试的时候用错了函数导致没有接收到数据,后来看了在packages\freemodbus-latest文件中的README_ZH的说明文件,里面有详细的软件说明,这个文件包需要对软件包进行更新下载后,程序的文件目录中才会有,别忘记下载更新,ENV中用pkgs --update命令。
因为我是对传感器进行读取所以用了eMBMasterReqReadHoldingRegister函数就行,具体的说明README中都有,不再赘述。
但是需要注意一个事情
那就是读取后的数据返回在哪里的问题,这个函数并没有读取到的数据返回,然后我百度后发现,是需要直接对一个数组进行直接引用
具体可以看下面的帖子以及原作者的回复
https://club.rt-thread.org/ask/question/424890.html
在这里插入图片描述
usMRegHoldBuf也就是读取的数据,需要注意的就是上图红框中的那句话,usMRegHoldBuf [2] [1],是ID为3,寄存器1的数据
OK,简单的应用就是如此。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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通信功能。无论是在工业自动化领域还是其他领域,使用该主机可以快速实现设备之间的数据通信。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值