声明:
这个MODBUS协议是从2018.7.13开始写,到今天7.18总共写了5天。时间比较短,肯定有很多不足之处。希望大家把发现的BUG或者要求都告诉我,
我会进行改进,并将结果通知您。我的联系方式是 QQ: 108287205
文件结构:
UHEAD.H - 这个头文件里包含的是u8,u16,u32的数据类型定义,其他的没什么了。
MODBUS - 这里定义了REQ(请求)和RSP(回复)这两种模式所使用的公共的函数。异常代号和功能码都在这里,数据类型都在这里
- 还有一个定时器所使用的函数。这个函数也被REQ,RSP公用
- 注意这里仅需要配置一个地方:MD_BUFNUM 足够大就可以。这是定义存放MODBUS数据的大小
MODBUS_REQ - 请求模式使用(主机)
MODBUS_RSP - 回复模式使用(从机)
MODBUS_CONFIG - 除了MD_BUFNUM,所有的配置都在这里
数据存放位置:
在MODBUS_CONFIG.C中定义了四个数组,根据名字可以知道,当为从机RSP模式时,分别是输出线圈,输入线圈,输出寄存器,输入寄存器数据存放的位置。
当为主机REQ模式时,只使用前2个数组,输出线圈数组保存的是发送的器件地址,命令,数量,地址,所以大小至少为6;
输入线圈数组临时保存的是从机的返回数据;
(注意)由于MODBUS协议数据的读取方式,为了方便读写,数据在数组中是倒着存放的,就是线圈数组的最后一个数的最低位是位置0,寄存器数组的最后一个数,是位置0
移植方法:
① MODBUS.H 中MD_BUFNUM足够大,保证在数据传输时不会溢出。
② MODBUS_CONFIG.H 中配置
- 包含串口头文件;
- 分别设置REQ,RSP模式的串口初始化函数;
- 分别设置REQ,RSP模式的配置串口发送一个字节的函数;
- 如果是从机,设置地址,地址范围(1~247);
- 配置四组数组的大小,这四个数组功能分别是输出线圈,输入线圈,输出寄存器,输入寄存器;
说明:当为主机REQ模式时,只使用输入和输出线圈数组大小至少为6。
使用方法:
--->首先,定义一个MD_datstr类型的变量。把这个变量想象成一个对象,一个变量就是一个对象。之后的函数调用哪个变量就是对哪个对象处理;
需要一个定时器,并开启定时中断;
需要一个串口,并开启接收中断;
将MODBUS.H中的 MD_Fun_InTime(MD_datstr* pMD_datstr,u32 period)放在定时器中断中,period值是定时器中断的周期时间,单位us
--->从机RSO模式下
使用RSP.H中的函数 MD_RSP_Init(u16 baud,MD_datstr* pMD_Reqstr) 初始化对象,配置波特率;
将 RSP_Fun_InUart(MD_datstr* pMD_datstr,u8 receiveByte) 放在串口接收中断中;
在主程序中
不断判断是否接收到数据,然后调用 RSP_CallBack(MD_datstr* pMD_datstr)进行处理,该函数返回异常,可以接收进行处理。
举例:
if(MD_str.flag_receiveOK == MD_OK)
{
RSP_CallBack(&MD_str);
}
--->主机REQ模式下使用
MD_REQ_Init(u16 baud,MD_datstr* pMD_Reqstr)初始化对象,配置波特率
使用req.H中的函数对从机进行询问,
主程序中不断判断是否接收到数据,然后调用REQ_CallBack(MD_datstr* pMD_Reqstr);进行处理。
__weak修饰的函数主要对应的是异常处理,请根据需要改写。
举例:
if(MD_str.flag_listener) //发送数据后监听
{
if(MD_str.flag_waitRelpy == MD_NO) //等待超时
{
ErroOutTime(&MD_str); //超时处理
MD_str.flag_listener = 0; //停止监听
}
else
if(MD_str.flag_receiveOK == MD_OK) //有数据接收到
{
erro = REQ_CallBack(&MD_str);
if(erro) //处理异常
{
printf("erro = 0X%X\r\n",erro);
}else
{
printf("OK--------------------\r\n");
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
1.本例程实现的是主控器与电机驱动器之间的ModBus RTU通信,电机驱动器为成都艾思控AQMD6020NS 2.主控芯片STM32F103C8T6,其USART3作为RS485通信端口 3.作为485主机,采用串口空闲中断+DMA方式接收从机数据 4.主控器与上位机目前采用RS232通讯实现控制(USART1) 5.本程序已通过Modbus Slave 软件的测试,一切运行正常 6.本程序已经通过与电机驱动器的测试,一切正常
资源推荐
资源详情
资源评论














收起资源包目录





































































































共 160 条
- 1
- 2
资源评论


wungsun
- 粉丝: 1
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- extjs4.2项目(使用全局store确保下拉框数据稳定)
- 微信小程序开发 API 封装与业务实现 通过封装wx.request,统一处理请求配置、错误码映射等 提供登录、注册等接口,含表单验证、异步处理 简化 API 调用,提升开发效率,实现基础业务功能
- 3a9fbb130e8e4a71c66de8505e27fcdc.JPG
- 基于 Rust 的多线程 Web 服务器
- 7ec6824a003847fd36f4b08a61fcadd0.mqb
- Jaspe二次开发SDK
- Wireshark-4.4.7-x64+教程.zip
- IB infiniband ibdump数据抓包实例
- 非线性方程组求解及matlab实现.ppt
- 集团家具电子商务平台运作可行性分析.ppt
- 金湖县网络安全建设与网络社会治理试题(及答案).doc
- 酒店电子商务.ppt
- 软件测试培训-基础篇.ppt
- 软件工程网上作业题答案.doc
- 软件开发项目的风险分析与控制.doc
- 风险评估算法简析.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
