modbus控制传感器

embedded/2024/10/24 2:36:46/

文章目录

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

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

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

modbus_9">modbus报文分析实例

无标题.png

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

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

modbus_22">移植libmodbus

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

问题

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

freertos_33">添加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.ppmy.cn/embedded/90593.html

相关文章

程序员找工作之操作系统面试题总结分析

程序员在找工作面试时,操作系统方面可能会被问到的问题涵盖了多个核心知识点和概念。以下是对这些面试问题的总结和分析: 1. 核心硬件与体系结构 微机的核心部件:询问微机硬件系统中最核心的部件是什么(CPU)。处理机…

CSP-J 复赛 模拟题 解析版

根据解析写代码1&#xff1a; #include <bits/stdc.h> using namespace std; long long a[101010]; long long b[101010]; int main(){bool flag0;long long t;cin>>t;while(t--){long long n,k;cin>>n>>k;for(int i1;i<n;i){cin>>a[i]>…

知识图谱和 LLM:多跳问答

检索增强生成&#xff08;RAG&#xff09;应用程序通过将外部来源的数据集成到 LLM 中&#xff0c;擅长回答简单的问题。但他们很难回答涉及将相关信息之间的点连接起来的多部分问题。这是因为 RAG 应用程序需要一个数据库&#xff0c;该数据库旨在存储数据&#xff0c;以便轻松…

深入剖析Apache Flink的状态后端

Apache Flink的状态后端是其状态管理的核心组件&#xff0c;负责存储和管理Flink程序的状态信息。状态后端的选择直接影响到Flink程序的容错能力、性能以及与外部系统的集成能力。本文将详细介绍Flink中的不同状态后端&#xff0c;包括它们的工作原理、特点、适用场景以及如何配…

明日周刊-第19期

演唱会现场的感受确实跟耳机里的感觉非常不一样&#xff0c;听见音响和人声真真切切出现在你身边&#xff0c;那种震撼可以让你暂时忘却生活的烦恼。感谢8月3日的蔡健雅演唱会&#xff0c;凑巧的是这一场是今年巡演的最后一场。 文章目录 资源分享言论歌曲推荐 资源分享 nginx…

嵌入式初学-C语言-练习三

#部分题目可能在之前的博客中有&#xff0c;请谅解&#xff0c;保证常见题型均被发出# 1.计算n以内所有正奇数的和 ? n值通过键盘输入 代码&#xff1a; 1 /*2 需求&#xff1a;计算n以内所有正奇数的和 ? n值通过键盘输入3 */4 #include <stdio.h>5 6 int main()7 …

miui11固定刷入TWRP和无密data分区 2024-08-04

测试设备: 小米红米note7 pro (violet) MIUI版本: V11.0.8.0.PFHCNXM (小米官方系统)(安卓9 工具软件: Android SDK Platform-Tools 32.0 (谷歌官方工具:​​​​​​SDK 平台工具版本说明 | Android Studio | Android Developers twrp-3.7.0_9-0-violet (twrp官方包) X…