这一节我们来封装最后一种应用(Modbus RTU Master应用),RTU主站的开发与TCP客户端的开发是一致的。同样的我们也不是做具体的应用,而是实现RTU主站的基本功能。我们将RTU主站的功能封装为函数,以便在开发具体应用时调用。

对于RTU主站我们主要实现的功能有两个:其一是生成访问RTU从站的命令,总共支持8中功能码。其二是对RTU从站端返回的信息进行解析并根据结果进行各种操作,同样也是支持8中功能吗的操作。具体软件访问结构如下:

1、访问命令的生成

客户端作为主动交互端,需要向服务器发各种操作请求命令。所以对于RTU主站来说,首先要生成访问服务器的命令。生成命令只需要按标准的协议格式来生成即可,目前我们只支持前面提到的8个功能码。

/*生成访问从站的命令*/

uint16_t CreateAccessSlaveCommand(ObjAccessInfo objInfo,void *dataList,uint8_t *commandBytes)

这样在开发具体的客户端应用时只需要调用这个函数来生成访问服务器的命令就可以了。

2、响应信息的解析

如前一节所述,服务器收到命令后,根据命令进行处理并生成响应信息返回给客户端。客户端接到命令后首先要对响应信息进行解析,解析的过程其实与服务器端是一致的。所不同的是,不需要再根据解析结果生成响应信息了。

/*解析收到的从站相应信息*/

void ParsingSlaveRespondMessage(uint8_t *recievedMessage)

这样在开发客户端应用时,我们调用这一函数来解析响应信息就可以了。

3、响应处理

对于解析出来的信息,我们需要根据情况实现操作,比如修改变量的值等,应为主要支持的操作码是8个,理论上对应的每种功能码都会有不同的操作,但事实上,由于写操作命令已经不需要做任何操作了,所以对应的操作实际上只有读操作的4种功能码。

/*处理读从站状态量返回信息,读线圈状态位0x01功能码*/

static void HandleReadCoilStatusRespond(uint8_t *receivedMessage,uint16_t startAddress,uint16_t quantity)

/*处理读从站状态量返回信息,读输入状态位0x02功能码*/

static void HandleReadInputStatusRespond(uint8_t *receivedMessage,uint16_t startAddress,uint16_t quantity)

/*处理读从站寄存器值的返回信息,读保持寄存器0x03功能码)*/

static void HandleReadHoldingRegisterRespond(uint8_t *receivedMessage,uint16_t startAddress,uint16_t quantity)

/*处理读从站寄存器值的返回信息,读输入寄存器0x04功能码*/

static void HandleReadInputRegisterRespond(uint8_t *receivedMessage,uint16_t startAddress,uint16_t quantity)

同样的,我们也定义一个函数指针数组来实现这些函数的调用:

void (*HandleServerRespond[])(uint8_t *,uint16_t,uint16_t)={HandleReadCoilStatusRespond, HandleReadInputStatusRespond, HandleReadHoldingRegisterRespond, HandleReadInputRegisterRespond};

到这里,RTU主站的封装就完成了,当然具体的数据处理部分需要在开发具体应用是才能确定。

源码网址是:https://github.com/foxclever/Modbus

欢迎关注:

Modbus协议栈开发笔记之六:Modbus RTU Master开发相关推荐

  1. ATECC508A芯片开发笔记(二):开发准备之 CryptoAuthLib 库简介与移植

    目录 ATECC508A芯片开发笔记(二):开发准备之 CryptoAuthLib 库简介与移植 Atmel两个官方lib介绍 一.CryptoAuthLib简介 Lib中最主要的三种对象类型: 二. ...

  2. 硬件开发笔记(六): 硬件开发基本流程,制作一个USB转RS232的模块(五):创建USB封装库并关联原理图元器件

    `该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/125369228 红胖子网络科技博文大全:开发技术集合( ...

  3. 硬件开发笔记(八): 硬件开发基本流程,制作一个USB转RS232的模块(七):创建基础DIP元器件(晶振)封装并关联原理图元器件

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/125370284 红胖子网络科技博文大全:开发技术集合( ...

  4. Modbus协议栈应用实例之六:Modbus ASCII从站应用

    自从开源了我们自己开发的Modbus协议栈之后,有很多朋友建议我针对性的做几个示例.所以我们就基于平时我们的应用整理了几个简单但可以说明基本的应用方法的示例,这一篇中我们来使用协议栈实现Modbus ...

  5. 【Visual C++】游戏开发笔记之六——游戏画面绘图(三)透明特效的制作方法

    本系列文章由zhmxy555编写,转载请注明出处.  http://blog.csdn.net/zhmxy555/article/details/7338082 作者:毛星云    邮箱: happy ...

  6. 嵌入式系统开发笔记90:ALIENTEK MiniSTM32开发板原理图基本电路讲解

    文章目录 前言 一.电源部分 1.USB输入 第一路通过CH340转换为串口信号,接MCU的串口1,该接口可以用于程序下载使用. 第二路直接与MCU的USB口相连接,用于USB通讯操作. 2.电源开关 ...

  7. SSD202开发笔记 | 01- 东山Pi壹号开发板快速上手(原厂SDK快速入门)

    本文中我使用Ubuntu 18.04,阿里源. 一.东山Pi壹号开发板 东山Pi壹号开发板是联合芯片原厂星宸科技一起推的最小Linux开发板: 主控芯片: 星辰科技 SSD202D 内置128MB D ...

  8. Kinect开发笔记之六Kinect Studio的应用

    这一次我们来操作一下Kinect Studio,体验一下它给我们带来的功能. 首先我们需要打开Developer Toolkit Browser 1.8,打开后在默认情况下,光标是选择在All选项卡上 ...

  9. LwIP应用开发笔记之六:LwIP无操作系统TCP客户端

    上一篇我们基于LwIP协议栈的RAW API实现了一个TCP服务器的简单应用,接下来一节我们来实现一个TCP客户端的简单应用. 1.TCP简述 TCP(Transmission Control Pro ...

最新文章

  1. ios 证书更新需要重新发布么_福利站证书更新,自己有空余时间一定要学会自己用电脑签名!...
  2. 【 MATLAB 】filter 函数介绍 之 Filter Data in Sections
  3. 程序人生系列之新闻发布系统 在网站部署经验分享
  4. JVM调优总结(五)-分代垃圾回收详述1
  5. boost::hana::repeat用法的测试程序
  6. python断言assertequal_python-尝试断言AlmostEqual / assertEqual时,不受支持的操作数类型...
  7. CursorLoader的进级实践
  8. 计算机系统-Unicode字符集与它包含的UTF-8解决方案
  9. 计算机体系结构五大部分组成
  10. docker数据卷之dockerfile
  11. Web开发之Servlet
  12. 浙大PAT考试经验/考前必看/日常刷题总结(经验只写了一点点
  13. 负载均衡下的多台tomcat服务器,通过memcache实现session共享
  14. linux内核计算次方,linux内核bic和cubic实现
  15. 知网和万方下载论文收费模式,被这家网站打破,令人拍手叫好
  16. 环境变量的作用及设置方法
  17. 主力大单流入前十的创业板股票中小板股票20180301
  18. 关于 使用python向qq好友发送消息(对爬虫的作用----当程序执行完毕或者报错无限给自己qq发送消息,直到关闭)...
  19. 《概率与数理统计》知识点【更新中】
  20. 钉钉小程序快照技术初窥

热门文章

  1. 去掉input密码框自动补全功能
  2. mount 挂载光盘
  3. BZOJ 2124 等差子序列 线段树维护哈希
  4. sql server select和set赋值的区别
  5. 关系数据库SQL之可编程性触发器
  6. bzoj 4551[Tjoi2016Heoi2016]树
  7. Android开发中依赖注入的应用
  8. 记录下Lambda常用的表现形式
  9. 为什么0.1无法被二进制小数精确表示?
  10. 留言板asp mysql_ASP简单入门(制作一个简单的留言板 )