開發環境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的資源包為0.2.2,Agile Modbus軟件包版本為v1.1.2。工程使用上一篇 RT-Thread中RS485驅動包的使用 工程為基礎。
單片機作為主站Master,從站使用軟件Modbus Slave模擬。
打開工程,添加軟件包Agile Modbus,添加成功,先進行編譯,查看是否有錯誤。編譯正常。
根據Agile Modbus軟件包的文檔介紹,
- 主機:
- 1.agile_modbus_rtu_init / agile_modbus_tcp_init 初始化 RTU/TCP 環境
- 2.agile_modbus_set_slave 設置從機地址
- 3.清空接收緩存
- 4.agile_modbus_serialize_xxx 打包請求數據
- 5.發送數據
- 6.等待數據接收結束
- 7.agile_modbus_deserialize_xxx 解析響應數據
- 8.用戶處理得到的數據
參考代碼為
#include
#include
#include "rs485.h"
#include
#define DBG_TAG "rtu_master"
#define DBG_LVL DBG_INFO
#include
int main(void)
{
rs485_init();
uint8_t ctx_send_buf[AGILE_MODBUS_MAX_ADU_LENGTH];
uint8_t ctx_read_buf[AGILE_MODBUS_MAX_ADU_LENGTH];
uint16_t hold_register[10];
agile_modbus_rtu_t ctx_rtu;
agile_modbus_t *ctx = &ctx_rtu._ctx;
agile_modbus_rtu_init(&ctx_rtu, ctx_send_buf, sizeof(ctx_send_buf), ctx_read_buf, sizeof(ctx_read_buf));
agile_modbus_set_slave(ctx, 1);
LOG_I("Running.");
while (1)
{
rt_thread_mdelay(100);
int send_len = agile_modbus_serialize_read_registers(ctx, 0, 10);
rs485_send(ctx->send_buf, send_len);
int read_len = rs485_receive(ctx->read_buf, ctx->read_bufsz, 1000, 20);
if (read_len == 0)
{
LOG_W("Receive timeout.");
continue;
}
int rc = agile_modbus_deserialize_read_registers(ctx, read_len, hold_register);
if (rc < 0)
{
LOG_W("Receive failed.");
if (rc != -1)
LOG_W("Error code:%d", -128 - rc);
continue;
}
LOG_I("Hold Registers:");
for (int i = 0; i < 10; i++)
LOG_I("Register [%d]: 0x%04X", i, hold_register[i]);
rt_kprintf("rnrnrn");
}
}
因為我們使用的是rs485驅動包,根據例程,我們知道需要增加幾個函數,如下:
static int Bsp_Rs485_init(void); //Rs485初始化+設置超時時間
static int Bsp_Rs485_Tx(uint8_t *buf,int size); //Rs485 發送
static int Bsp_Rs485_Rx(uint8_t *buf,int size); //Rs485接受
根據例程,修改主函數modbus后的代碼如下:
#include
#include
#include "rs485.h"
#include
#define DBG_TAG "rtu_master"
#define DBG_LVL DBG_INFO
#include
int main(void)
{
Bsp_Rs485_init();//
uint8_t ctx_send_buf[AGILE_MODBUS_MAX_ADU_LENGTH];
uint8_t ctx_read_buf[AGILE_MODBUS_MAX_ADU_LENGTH];
uint16_t hold_register[10];
agile_modbus_rtu_t ctx_rtu;
agile_modbus_t *ctx = &ctx_rtu._ctx;
agile_modbus_rtu_init(&ctx_rtu, ctx_send_buf, sizeof(ctx_send_buf), ctx_read_buf, sizeof(ctx_read_buf));
agile_modbus_set_slave(ctx, 1);
LOG_I("Running.");
while (1)
{
rt_thread_mdelay(100);
int send_len = agile_modbus_serialize_read_registers(ctx, 0, 10);
Bsp_Rs485_Tx(ctx->send_buf, send_len);//
int read_len = Bsp_Rs485_Rx(ctx->read_buf, ctx->read_bufsz);//
if (read_len == 0)
{
LOG_W("Receive timeout.");
continue;
}
int rc = agile_modbus_deserialize_read_registers(ctx, read_len, hold_register);
if (rc < 0)
{
LOG_W("Receive failed.");
if (rc != -1)
LOG_W("Error code:%d", -128 - rc);
continue;
}
LOG_I("Hold Registers:");
for (int i = 0; i < 10; i++)
LOG_I("Register [%d]: 0x%04X", i, hold_register[i]);
rt_kprintf("rnrnrn");
}
}
編譯正常,下載到開發板。
打開模擬軟件Modbus Slave,設置基本參數。Modbus Slave的使用參考:參考
可以看到輸出端口打印出了從站數據的信息。
-
驅動器
+關注
關注
53文章
8271瀏覽量
147056 -
ModBus協議
+關注
關注
3文章
177瀏覽量
33529 -
RS485接口
+關注
關注
2文章
62瀏覽量
14240 -
STM32F407
+關注
關注
15文章
188瀏覽量
29650 -
RT-Thread
+關注
關注
31文章
1305瀏覽量
40383
發布評論請先 登錄
相關推薦
使用menuconfig配置基于RT-Thread的NimBLE軟件包
基于RT-Thread實現的Agile Modbus協議棧
RT-Thread中Agile Modbus軟件包的使用
RT-Thread中的mymqtt軟件包添加步驟與使用方法
RT-Thread Studio安裝軟件包agile-modbus后編譯出現arm-none-eabi-gcc: fatal錯誤
RT-Thread 軟件包介紹
RT-Thread社區上有哪些優秀的軟件包?
RT-Thread在線軟件包改為本地軟件包的方法
![<b class='flag-5'>RT-Thread</b>在線<b class='flag-5'>軟件包</b>改為本地<b class='flag-5'>軟件包</b>的<b class='flag-5'>方法</b>](https://file1.elecfans.com/web2/M00/90/34/wKgaomTV3BWAY_RKAAEC9HeRKXM649.jpg)
RT-Thread使用cjson軟件包發送64位長整型數據
![<b class='flag-5'>RT-Thread</b>使用cjson<b class='flag-5'>軟件包</b>發送64位長整型數據](https://file1.elecfans.com/web2/M00/A7/B4/wKgaomUmSiWAQ_1xAAAObDzqKfU258.jpg)
RT-Thread中Lan8720和lwip協議棧的使用
![<b class='flag-5'>RT-Thread</b><b class='flag-5'>中</b>Lan8720和lwip協議棧的使用](https://file1.elecfans.com/web2/M00/A9/B9/wKgZomUoqG2AfnI1AADoV9xQNtA794.jpg)
RT-Thread中mymqtt軟件包的使用方法
![<b class='flag-5'>RT-Thread</b><b class='flag-5'>中</b>mymqtt<b class='flag-5'>軟件包</b>的<b class='flag-5'>使用方法</b>](https://file1.elecfans.com/web2/M00/A7/F7/wKgaomUorsCAacB1AAA5N-PCBs4615.jpg)
評論