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

7,KQM模块的驱动

1,查资料,查模块的通信接口(单片机和模块之间采用什么方式通信)硬件接口,驱动方式(串口驱动用串口发送接收PC10,PC11)

只用了三个脚:VCC GND TX,

RX和F没有用

传输数据,本项目中不要用串口3,串口3是留给wifi的,在硬件上已经固定了, 所以其他的任选一个用串口4传输数据,

KQM.c

#include "kqm.h"
#include "string.h"
//自己能写代码并理解
//voc PPM ,甲醛mg/m3, co2PPM
KQM kqm = {0};
//1.IO初始化
//2.外设初始化
//3.中断初始化
void KQM_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitTypeDef GPIO_InitStructure = {0};//定义结构体 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//推挽 GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空	GPIO_Init(GPIOC, &GPIO_InitStructure); 	//2.外设初始化RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);	USART_InitTypeDef USART_InitStructure = {0}; USART_InitStructure.USART_BaudRate = 9600; //波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据位 USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位 USART_InitStructure.USART_Parity = USART_Parity_No; //校验USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流失能USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(UART4, &USART_InitStructure); USART_Cmd(UART4, ENABLE); //3.中断初始化NVIC_InitTypeDef NVIC_InitStructure = {0}; NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;// 0-3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//0-3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //4,中断源USART_ITConfig(UART4,USART_IT_RXNE,ENABLE);//开启串口  接收中断USART_ITConfig(UART4,USART_IT_IDLE,ENABLE);//串口空闲中断
}//模块是主动传输数据,不需要写数据发送函数,用中断接收数据,所以也不需要写接收函数//中断服务函数
void UART4_IRQHandler(void)
{if(USART_GetITStatus(UART4,USART_IT_RXNE) == SET){		kqm.rxbuff[kqm.rxlen] =  USART_ReceiveData(UART4);kqm.rxlen++;USART_ClearITPendingBit(UART4,USART_IT_RXNE);}//空闲中断在UART一段时间没有接收到数据时触发,表示接收完成或空闲状态if(USART_GetITStatus(UART4,USART_IT_IDLE) == SET){uint8_t data = USART_ReceiveData(UART4);//接收数据//UART4的接收缓冲区已经处理完毕或达到空闲状态 kqm.rxflag=1;}	
}//解析接收的数据//   1.判断数据接收完成
//   2.判断数据的正确性(校验)
//   3.开始解析数据#include "led.h"
#include "stdio.h"
void KQMDataAnaly(void)
{if(kqm.rxflag == 1){//在预热阶段模块传送所有数据的高位以及低位字节为0xff,当接收到此数据时可视为预热数据,不予处理//判断是否是预热阶段if(kqm.rxbuff[1]== 0xff && kqm.rxbuff[2]== 0xff && kqm.rxbuff[3]== 0xff && kqm.rxbuff[4]== 0xff && kqm.rxbuff[5]== 0xff && kqm.rxbuff[6]== 0xff){memset(kqm.rxbuff,0,10);kqm.rxlen=0;kqm.rxflag=0;return ;}		                   uint8_t checkval =(uint8_t)(kqm.rxbuff[0]+kqm.rxbuff[1]+kqm.rxbuff[2]+kqm.rxbuff[3]+kqm.rxbuff[4]+kqm.rxbuff[5]+kqm.rxbuff[6]);if(checkval == kqm.rxbuff[7])	//校验{kqm.voc = (kqm.rxbuff[1]<<8|kqm.rxbuff[2])*0.1;//ppmkqm.hcho = (kqm.rxbuff[3]<<8|kqm.rxbuff[4])*0.01;//mg/m3kqm.co2 = (kqm.rxbuff[5]<<8|kqm.rxbuff[6])*0.1;//ppm//例如:rxbuff[1]:0000 0011//			rxbuff[2]: 1011 1001//rxbuff[1]<<8得到rxbuff[1]:0000 0011 0000 0000//rxbuff[1]<<8|rxbuff[2]得voc:0000 0011	1011 1001 memset(kqm.rxbuff,0,10);kqm.rxlen=0;kqm.rxflag=0;printf("voc:%.1f,hcho:%.2f,co2:%.1f\r\n",kqm.voc,kqm.hcho,kqm.co2);	}else//校验失败{memset(kqm.rxbuff,0,10);kqm.rxlen=0;kqm.rxflag=0;}}
}

kQm.h

#ifndef _KQM_H_
#define _KQM_H_#include "stm32f10x.h"typedef struct
{uint8_t rxbuff[10];   //rxbuff[1]一个数占8位uint8_t rxlen;uint8_t  rxflag;float voc;float hcho;float co2;}KQM;extern KQM kqm;void KQM_Init(void);
void KQMDataAnaly(void);
#endif

相关文章:

7,KQM模块的驱动

1&#xff0c;查资料&#xff0c;查模块的通信接口&#xff08;单片机和模块之间采用什么方式通信&#xff09;硬件接口&#xff0c;驱动方式(串口驱动用串口发送接收PC10&#xff0c;PC11) 只用了三个脚&#xff1a;VCC &#xff27;&#xff2e;&#xff24; &#xff34;&…...

软件验收测试报告模版分享,如何获取专业的验收测试报告?

软件验收测试报告是对软件开发过程中的最后一步确认&#xff0c;通过对软件进行全面、系统的检查和测试&#xff0c;形成一份详细的报告&#xff0c;以评估软件是否满足用户需求和设计要求。验收测试报告起到了非常重要的作用&#xff0c;不仅可以帮助开发者了解软件开发的质量…...

【arm扩容】docker load -i tar包 空间不足

背景&#xff1a; 首先我在/home/nvidia/work下导入了一些镜像源码tar包。然后逐个load进去。当我 load -i dev-aarch64-18.04-20210423_2000.tar包的时候&#xff0c;出现 Error processing tar file(exit status 1): write /9818cf5a7cbd5a828600d9a4d4e62185a7067e2a6f2ee…...

基于PID的直流电机自动控制系统的设计【MATLAB】

摘 要 本文在广泛查阅资料&#xff0c;了解直流电机特性的基础上&#xff0c;对直流电机的控制原理进行了的研究&#xff0c;设计了一款基于PID控制器的简单直流电机自动控制系统。 首先&#xff0c;分析了直流电机的应用背景和发展现状&#xff0c;对直流电机的工作原理和数学…...

MySQL----事务

MySQL 事务主要用于处理操作量大&#xff0c;复杂度高的数据。比如&#xff0c;在学校管理系统中&#xff0c;我们删除一个学生&#xff0c;既需要删除学生的基本资料&#xff0c;也要删除和该学生相关的信息&#xff0c;如班级&#xff0c;考试成绩等等&#xff0c;这样&#…...

客观评价,可道云teamOS搭建的企业网盘,如Windows本地电脑一般的使用体验真的蛮不错

不管是企业网盘还是私有网盘&#xff0c;简单易用一直是我比较在意的。快速能上手使用&#xff0c;甚至不需要习惯一套新的操作逻辑&#xff0c;代表着不需要学习适应&#xff0c;能够迅速投入正常使用。 在这个过程中&#xff0c;可道云teamos以其Windows电脑般的流畅体验&am…...

当页面中有多个echarts图表的时候,resize不生效的修改方法

一、本来的代码 var myChart1 this.$echarts.init(document.getElementById(‘xxxx’)); let option {}; myChart1.setOption(option); setTimeout(function () {window.onresize function () {myChart1.resize();} }, 200) 二、修改后的代码 var myChart1 this.$echart…...

connect-caption-and-trace——用于共同建模图像、文本和人类凝视轨迹预测

介绍 论文地址&#xff1a;https://arxiv.org/abs/2105.05964 源码地址&#xff1a;https://github.com/facebookresearch/connect-caption-and-trace 在过去&#xff0c;计算机视觉和自然语言处理领域的模型和算法的发展只有偶尔的重叠&#xff0c;但近年来&#xff0c;这两…...

iOS API方法弃用警告说明及添加

一、常见系统方法警告或说明释义 NS_DEPRECATED_IOS(6_0, 8_0) 释义&#xff1a;iOS用&#xff1b;且在6.0被引用&#xff0c;将在8.0后废弃此方法。NS_DEPRECATED(6_0, 6_6, 8_0, 8_8) 释义&#xff1a;MacOS与iOS中都可用&#xff1b;但Mac系统中是在6.0被引用&#xff0c;6…...

canvas绘制红绿灯路口(二)

系列文章 canvas绘制红绿灯路口&#xff08;一&#xff09; 无图不欢&#xff0c;先上图 优化项&#xff1a; 一&#xff1a;加入人行道红绿信号 二&#xff1a;加入专用车道标识&#xff08;无方向标识时采用专用车道标识&#xff09; 三&#xff1a;东南西北四项路口优化绘…...

Semantic Kernel 直接调用本地大模型与阿里云灵积 DashScope

本文主要介绍如何在无需网关&#xff0c;无需配置 HttpClient 的情况下&#xff0c;使用 Semantic Kernel 直接调用本地大模型与阿里云灵积 DashScope 等 OpenAI 接口兼容的大模型服务。 1. 背景 一直以来&#xff0c;我们都在探索如何更好地利用大型语言模型&#xff08;LLM&…...

【人工智能】深度解读 ChatGPT基本原理

ChatGPT是OpenAI开发的一种基于人工智能技术的自然语言处理工具&#xff0c;它代表了自然语言处理&#xff08;NLP&#xff09;技术的前沿进展。ChatGPT的基本原理建立在一系列先进技术和方法之上&#xff0c;主要包括GPT&#xff08;Generative Pre-trained Transformer&#…...

【教程】2024年如何快速提取爆款视频的视频文案?

关于如何提取爆款视频的视频文案&#xff0c;很朋友都不是很清楚&#xff0c;今天小编就带大家了解一下&#xff0c;希望这个知识点对大家有所帮助。 剪辑工作者有剪映、arctime、视频字幕等&#xff0c;但唯独编辑工作者或者编导没用直接提取视频文案的工具今天就说说可直接在…...

【MySQL连接器(Python)指南】02-MySQL连接器(Python)版本与实现

文章目录 前言MySQL连接器(Python)版本MySQL连接器(Python)实现总结前言 MySQL连接器(Python),用于让Python程序能够访问MySQL数据库。要想让Python应用程序正确高效地使用MySQL数据,就需要深入了解MySQL连接器的特性和使用方法。 MySQL连接器(Python)版本 下表总结了可用的…...

Vim入门教程

Vim是一个高度可配置的文本编辑器&#xff0c;用于创建和修改各种类型的文本文件。以下是一些基本的Vim使用示例&#xff0c;展示如何在Vim中进行编辑和操作。 1. 打开和保存文件 打开一个名为example.txt的文件&#xff1a; vim example.txt 打开多个文件&#xff0c;使用大…...

机器学习课程复习——隐马尔可夫

不考计算题 Q:概率图有几种结构? 条件独立性的公式? 顺序结构发散结构汇总结构Q:隐马尔可夫模型理解? 概念 集合:状态集合、观测集合 序列:状态序列、观测序列...

大数据-数据分析初步学习,待补充

参考视频&#xff1a;数据分析只需3小时从入门到进阶&#xff08;up亲身实践&#xff09;_哔哩哔哩_bilibili 数据指标&#xff1a; 对当前业务有参考价值的统计数据 分类&#xff1a;用户数据&#xff0c;业务数据&#xff0c;行为数据 用户数据 存量&#xff1a; DAU&#…...

微服务为什么使用RPC而不使用HTTP通信

微服务架构中使用RPC&#xff08;Remote Procedure Call&#xff09;而不是HTTP通信&#xff0c;主要是因为RPC在某些方面相比HTTP具有显著的优势。以下是一些关键原因&#xff1a; 性能&#xff1a; RPC通常比HTTP性能更高。RPC协议可以使用二进制序列化格式&#xff08;如gRP…...

怪物猎人物语什么时候上线?游戏售价多少?

怪物猎人物语是一款全新的RPG游戏&#xff0c;玩家在游戏中将化身为骑士&#xff0c;不断与怪物建立羁绊、不断成长&#xff0c;踏上前往外面世界的旅程&#xff0c;且最终目的地是以狩猎怪物为生的猎人世界。因为最近有不少玩家在关注这款游戏&#xff0c;所以下面就给大家分享…...

以创新思维点亮盲盒小程序:探索未来零售新趋势

随着科技的飞速发展和消费者需求的不断变化&#xff0c;零售行业正迎来一场前所未有的变革。在这个变革的浪潮中&#xff0c;盲盒小程序凭借其独特的魅力和巨大的潜力&#xff0c;成为未来零售新趋势的代表之一。本文将探讨如何以创新思维点亮盲盒小程序&#xff0c;探索未来零…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...