modbus控制传感器

news2024/9/30 19:27:44

文章目录

      • 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1979862.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LinuxC++(11):创建一个进程

Linux的0、1和2号进程 整个linux系统全部的进程是一个树形结构。 0号进程(系统进程)是所有进程的祖先,它创建了1号和2号进程。 (相当于是我们世界的时间线) 1号进程(systemd)负责执行内核的…

批发行业手机入库识别单据 源码CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构

一、手机入库好处 1. 便捷性高:可以随时随地通过手机进行入库操作,不受时间和地点的限制,方便库存管理者或相关人员及时记录商品或物品的入库信息。 2. 提高效率:采用手机端快速数据录入,避免了繁琐的手工记录&#x…

Linux从0到1——基础IO(上)【文件描述符/重定向/缓冲区】

Linux从0到1——基础IO(上) 1. 预备知识2. 复习一下常见的C语言文件接口3. 系统调用接口3.1 函数传参小技巧——标志位3.2 使用系统调用接口3.2.1 open3.2.2 write3.2.3 read 4. 文件描述符fd4.1 fd的本质4.2 理解struct file结构体4.3 fd的分配规则 5. …

学习分享:解析电商 API 接入的技术重难点及解决方案

在当今电商业务迅速发展的时代,接入电商 API 已成为许多企业提升竞争力和拓展业务的重要手段。然而,在这个过程中,往往会遇到一系列的技术重难点。本文将深入解析这些问题,并提供相应的解决方案。 一、电商 API 接入的技术重难点 …

按摩虎口穴位的作用

按摩虎口穴位的作用 虎口穴位是人体手背上的一个重要穴位,它位于手指掌侧第一指骨和第二指骨之间的凹陷处。 按摩虎口穴位有很多益处,包括: 缓解头痛和眼疲劳: 按摩虎口穴位可以缓解头痛和眼疲劳,特别是由于长时间使用…

未授权访问漏洞系列详解①!

Redis未授权访问漏洞 Redis 默认情况下,会绑定在 0.0.0.0:6379 ,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的…

Golang | Leetcode Golang题解之第322题零钱兑换

题目&#xff1a; 题解&#xff1a; func coinChange(coins []int, amount int) int {var (dfs func(x int) int // x金额 最少硬币个数memo make(map[int]int) // 记忆化)dfs func(x int) int {//边界if x 0 {return 0} else if x < 0 {return math.MaxInt32}//记…

wangpang.xingkong(tou)

目录 client │ ├── client.h/c connect login recv send getcommand pausecommand putscommand │ ├── main.c 登陆&监听 │ ├── str_util.h/c 分割token字符串 conf │ └── server.conf server │ ├── config.h/c 读取文…

Android----Depth Anything尝鲜 小米手机部署

题目要求&#xff1a;了解Depth Anything (以及Depth Anything v2)基本原理&#xff0c;创新点。 Depth Anything 论文&#xff1a;Depth Anything: Unleashing the Power of Large-Scale Unlabeled Data 参考代码&#xff1a;Depth-Anything-Android GitHub 分析&#xff1a; …

深度学习在生物信息学中的应用

一、深度学习概念定义 深度学习&#xff08;Deep Learning&#xff09;是机器学习的一个子领域&#xff0c;它基于人工神经网络&#xff0c;尤其是深度神经网络。深度学习的核心思想是通过学习数据的表示层次和抽象层次&#xff0c;让机器能够具有类似于人类的分析学习能力。深…

lowbit(x)

返回x的最右边的一位1以及后面的所有数 x 1010 lowbit(x) 10x 101000 lowbit(x) 1000 一个整数的负数是补码(取反1) 应用&#xff1a; 求二进制中1的个数 题目 给定一个长度为 n 的数列&#xff0c;请你求出数列中每个数的二进制表示中 1的个数。 输入格式 第一行包…

uvm_config_db 和 uvm_resource_db :

uvm_config_db class my_driver extends uvm_driver;int my_param;function new(string name, uvm_component parent);super.new(name, parent);endfunctionvirtual task run_phase(uvm_phase phase);// 在组件内部获取配置值if (!uvm_config_db#(int)::get(this, ""…

python3 pyside6图形库学习笔记及实践(四)

目录 前言列表控件(QListWidget)创建列表增删插改查添加元素插入元素删除元素修改元素查找元素 常用信号和槽currentItemChangeditemChangedclear 列表排序列表的上下文菜单 图形视图框架简介框架核心图元类(QGraphicsItem)场景类(QGraphicsScene)视图类(QGraphicsView)交互机制…

守护数据安全:有效应对.hmallox勒索病毒的策略

引言 近年来&#xff0c;随着网络技术的飞速发展&#xff0c;勒索病毒成为网络安全领域的一大威胁。其中&#xff0c;.hmallox勒索病毒作为malox勒索软件家族的新变种&#xff0c;给个人和企业带来了极大的数据安全和经济损失风险。本文将对.hmallox勒索病毒进行详细介绍&…

机器学习用python还是R,哪个更好?

机器学习领域中&#xff0c;Python和R都是非常流行的编程语言&#xff0c;它们各有优势和特点&#xff1a; Python: 优势: 拥有丰富的库和框架&#xff0c;如scikit-learn、TensorFlow、PyTorch等&#xff0c;适合各种级别的机器学习任务。语法简洁清晰&#xff0c;易于学习。社…

3DM游戏运行库合集离线安装包2024最新版

3DM游戏运行库合集离线安装包是一款由国内最大的游戏玩家论坛社区3DM推出的集成式游戏运行库合集软件&#xff0c;旨在解决玩家在玩游戏时遇到的运行库缺失或错误问题。该软件包含多种常用的系统运行库组件&#xff0c;支持32位和64位操作系统&#xff0c;能够自动识别系统版本…

LeetCode每日一题_572.另一棵树的子树

解题思路&#xff1a; Step1:首先我们要知道如何判断两颗树相同&#xff0c;思路就是遍历每个节点&#xff0c;然后判断是否均相等&#xff0c;需要用递归来实现。代码如下所示&#xff1a; public static boolean equals(TreeNode t1,TreeNode t2){if(t1null&&t2null…

[Java]面向对象,从浅到深

快速入门 计算机的核心作用就是处理数据, 变量用来存储单个数据, 数组用来储存一批数据, 对象用来存储一类数据 什么是对象: 对象就是一种特殊的数据结构, 在java中万物皆对象 面相对象编程的好处: 更加符合人类思维习惯 类和实例对象 在java中必须先设计类, 才能根据类创…

git学习入门1——下载安装与添加用户标识设置name与Email

想法是这样的&#xff0c;先是自己工作闲暇之余在学习C语言&#xff0c;在跟一个某平台的机构学习C语言的基础知识&#xff0c;空闲之余学习了几天&#xff0c;想起了之前学习过程中某学员提出的git每日提交代码的那个表格记录&#xff0c;忽然想起自己也先学习git的使用。 先是…

三、初识工作流

基础操作 拖动操作&#xff0c;按住鼠标左键可以拖动 放大缩小&#xff0c;可以通过鼠标滚轮操作 节点含义 1、大模型 2、正向与负向提示词(生成图片的文字信息) 3、图片尺寸设定&#xff08;批次大小为每次生产图片数量&#xff09; 4、采样器 5、图片渲染 6、保存图像 设…