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,简单的应用就是如此。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值