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