当前位置: 首页 > news >正文

modbus控制传感器

文章目录

      • modbus报文分析实例
      • 移植libmodbus
        • 问题
      • 添加freertos
        • 初始化
        • 发送和接收
        • 发送和接收的回调函数
        • flush
      • 主从设备代码分析-主控如何读写从机
        • 1、串口传输,设置哪个串口、波特率、校验码、数据个数、体制位
        • 2、connect连接只是初始化
        • 3、主设备读写从设备1
        • 4、硬件操作
      • 注意:

stm32F103C8T6主控,发送libmodbus请求来读写寄存器,韦东山开发板
image.png

image.png
访问某一个设备需要5个参数
设备地址、寄存器类别、哪一个寄存器、读/写、具体值
image.png

modbus报文分析实例

无标题.png

libmodbus
rtu是使用串口来实现传输;
tcp是使用网络;
总体框架:三层、4个文件:
无标题.png

backend只有两个函数设计硬件,其他都是一样的,把这两个函数放到一个设备层里面;
image.png

移植libmodbus

用查询模式编写:
把设备写进一个结构体里面
image.png

问题

移植问题
image.png
搜索全部文件找这句,前面//去掉这一行
image.png

添加freertos

改造libmodbus
1、modbus.c
2、modbus_st_rtu
3、UART_Device
1、使能freertos
image.png
这个是hal库的时钟基准
image.png
时钟基准可以不改,改成TIM1也行
image.png

修改代码,用队列、信号量
使用uart的中断模式
使能中断,串口1、2都要使能

初始化

把队列、信号量、都创建出来;
使能发送中断
image.png

发送和接收

发送函数需要等待信号量,因为要发送完毕这一次才能发送下一次,主要原因是,你没发成功要返回一个报错,告知没成功,不然你咋知道发过去没
接收函数是直接读队列了,不需要等回调函数接收完成的信号,等队列就行了,如果收到数据,
image.png

发送和接收的回调函数

回调函数,发送函数不需要写队列的;
接收函数接收到数据后再写队列;
image.png

flush

清除数据,是接收数据,但是不使用,读取就是取走队列上的一个数据,只要不用就是清除;最后返回清除了多少个数据;
image.png

主从设备代码分析-主控如何读写从机

1、串口传输,设置哪个串口、波特率、校验码、数据个数、体制位

主控
image.png
从机,另外设置好自己的寄存器
设备地址保持一致,都是3
image.pngimage.png

主设备发送的数据里面包含:设备地址是3;
image.png
从设备设置自己的设备地址为3,接收到发来的数据中函数有设备地址3,就知道是访问自己;
image.png

2、connect连接只是初始化

image.png

3、主设备读写从设备1

(ctx, 0 ,2, vals)这个函数从0地址开始,读2个寄存器的值放入vals
image.png
image.png
如上图是读只读寄存器,如果主设备要写入数据到可读可写寄存器的话,那就是从设备接收到这个query请求包,会进行相应的操作,把数据写到对应的寄存器里面;

4、硬件操作

前面的操作只是改了寄存器上面的值,并没有对硬件进行操作;
这个I2C是传感器内部的芯片和温湿度模块的芯片传输,不是modbus的主从设备传输;
image.png

注意:

1、modbus的1bit寄存器,虽然是1bit,但是分配的buff是1byte
16bit的寄存器分配的是unsigned short类型就是2type;
2、使用libmodbus时,他只是操作分配出来的4种寄存器的buff;
3、如果要操作硬件:用户去写代码,根据寄存器里面的值操作编写对应的功能来操作硬件;
4、启动调度后编写的代码不会执行:
原因是这个启动调度的函数不会返回;
image.png

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PHP单例模式详解及应用
  • 使用Python库开发Markdown编辑器并将内容导出为图片
  • 学习笔记-优化问题
  • 正点原子imx6ull-mini-Linux驱动之Linux SPI 驱动实验(22)
  • Netty二
  • 【从零开始一步步学习VSOA开发】搭建VSOA运行环境
  • rust和c传递字符串的七种方法--翻译
  • 【HBZ分享】spring启动时自动装配的位置
  • 基于FPGA的数字信号处理(20)--半减器和全减器
  • PySide6/PyQT学习笔记(很杂)
  • 如何实现element UI循环表单?
  • 神奇的TypeScript -- 进阶篇之实用工具类型
  • 原神自定义倒计时
  • Codeforces Round 960 (Div. 2)-补题
  • Web 搜索引擎优化
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【node学习】协程
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 78. Subsets
  • CSS实用技巧
  • Javascript 原型链
  • js数组之filter
  • magento 货币换算
  • MySQL数据库运维之数据恢复
  • Puppeteer:浏览器控制器
  • python大佬养成计划----difflib模块
  • React16时代,该用什么姿势写 React ?
  • SpiderData 2019年2月16日 DApp数据排行榜
  • SpringBoot 实战 (三) | 配置文件详解
  • Vue2.x学习三:事件处理生命周期钩子
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 小李飞刀:SQL题目刷起来!
  • Java总结 - String - 这篇请使劲喷我
  • ​2021半年盘点,不想你错过的重磅新书
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • (55)MOS管专题--->(10)MOS管的封装
  • (PADS学习)第二章:原理图绘制 第一部分
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)springboot教学评价 毕业设计 641310
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (一)为什么要选择C++
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • ******IT公司面试题汇总+优秀技术博客汇总
  • ***测试-HTTP方法
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET 通过系统影子账户实现权限维持
  • .Net(C#)自定义WinForm控件之小结篇
  • .NetCore 如何动态路由
  • .Net环境下的缓存技术介绍
  • .net开发时的诡异问题,button的onclick事件无效
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题