如意控物联网项目(二)-ML307R模组软件调试之MQTT+硬件接口调试笔记

目录

概要

1、  操作系统----RTOS kernel

CMSIS-RTOS2

2、  程序API文档

3、  MQTT调试记录-2024年10月9日

4、  ML307_APP_DEMO_SDK使用指南

5、  MQTT登录onenet平台成功

6、  ML307R链接onenet平台成功-接收数据成功

7、  timer定时器调试

8、  操作系统--OS程序学习

1. 事件(Event)

2. 信号量(Semaphore)

3. 互斥锁(Mutex)

4. 消息队列(Message Queue)

总结

9、  UART调试

10、  CJSON调试

11、  file文件系统调试

12、  中移物联-oneos定位lbs

13、  获取模组运行状态信息

14、  gpio引脚配置及程序开发


概要

      最近在升级以前用air724UG开发的如意控物联网demo开源项目,由于中移物联的openCPU采用C语言+RTOS实时操作系统开发,开发起来确实比较难,就在我的博客里做一个开发记录,为了日后再开发时查看,也分享给同样做ML307R--openCPU开发朋友们,希望对大家有所帮助。

       前一个阶段的日记记录了我学习RTOS相关学习笔记,还有ML307R--openCPU开发环境搭建等笔记,这次笔记包含RTOS开发和硬件外围模块搭建和MQTT通讯等;由于没有时间发布博客,所以这些调试记录统一发出,具体内容详见目录,未来的预期是期望能够把如意控系统-Air724UG系统全面移植到这个平台上来,期望能够早日完工。

        由于本篇博客为调试笔记,记录比较凌乱和无序,给大家造成的不便敬请谅解,有什么问题可以随时留言交流,我会尽快回复大家。

这是如意控air724UG老版本的博客、视频、微信小程序等的开源信息,未来小程序将兼容老版本的微信小程序;等硬件电路图搞完以后也会同步开源给大家

未来开源资料(工程巨大,一个人搞确实难,期望能够早日完工,自己挖坑自己填 ̄□ ̄||):

a、硬件电路图--嘉立创开源

b、微信小程序原码开源---gitee

c、文档资料开源--csdn

我的博客《微信小程序+阿里物联平台+合宙Air724UG搭建无服务器物联系统(四)---微信小程序云开发(用于存储用户信息等)》, 一起来围观吧
https://blog.csdn.net/unforgettable2010/article/details/122993736?utm_source=app&app_version=5.4.0&code=app_1562916241&uLinkId=usr1mkqgl919blenicon-default.png?t=O83Ahttps://blog.csdn.net/unforgettable2010/article/details/122993736?utm_source=app&app_version=5.4.0&code=app_1562916241&uLinkId=usr1mkqgl919blen

我做的物联网开源项目,大家支持一下!一键三连,希望能对有相关开发应用的朋友有帮助。
打扰大家了

硬件电路开源地址:

https://oshwhub.com/codefarmer/ryk_open_20220212icon-default.png?t=O83Ahttps://oshwhub.com/codefarmer/ryk_open_20220212

软件开源地址:
https://gitee.com/TR_studio/WXtodvcicon-default.png?t=O83Ahttps://gitee.com/TR_studio/WXtodvc

B站视频演示
https://www.bilibili.com/video/BV1em4y1Z71o/?spm_id_from=333.999.0.0&vd_source=800bd4bfe94152648b6e85bd265a9f0cicon-default.png?t=O83Ahttps://www.bilibili.com/video/BV1em4y1Z71o/?spm_id_from=333.999.0.0&vd_source=800bd4bfe94152648b6e85bd265a9f0c

1、  操作系统----RTOS kernel

CMSIS-RTOS2

CMSIS-RTOS2 定义了一组标准的 RTOS API,这些 API 可以由不同的 RTOS 实现。常见的支持 CMSIS-RTOS2 的 RTOS 包括:

  • FreeRTOS: 一个流行的开源实时操作系统。
  • Keil RTX5: ARM 自己提供的 RTOS。
  • Micrium μC/OS-II 和 μC/OS-III: 商业 RTOS。
  • Segger embOS: 商业 RTOS。
  • 其他兼容的 RTOS

2、  程序API文档

程序SDK应用API接口文档查询软件位置

ML307R_OpenCPU_Standard_1.1.0.24053111_release\docs\ML307R_OpenCPU_API手册.chm

该软件可以搜寻API接口文档,打开后为如下图所示:

3、  MQTT调试记录-2024年10月9日

local ProductId = "XXXXXXXX"

local ProductSecret = "XXXXXXXXXXXXXXXXXXX"

4、  ML307_APP_DEMO_SDK使用指南

5、  MQTT登录onenet平台成功

onenet平台设备三元素信息修改

/*测试变量区,请修改以下参数*/#define APP_DEMO_MQTT_HOST "mqttstudio.heclouds.com"                                       // MQTT测试服务器地址,支持域名,demo使用的是一个公有MQTT服务器,网址:https://www.emqx.com/zh/mqtt/public-mqtt5-broker#define APP_DEMO_MQTT_PORT 1883                                                   // MQTT测试服务器端口#define APP_DEMO_MQTT_CLIENTID "RYK1"                           // MQTT测试客户端ID,对于同一服务器,clientid需要唯一,否则会互相挤下线#define APP_DEMO_MQTT_USERNAME "XXXXXXXXXX"                           // MQTT测试用户名#define APP_DEMO_MQTT_PASSWORD "version=2018-10-31&res=products%2FXXXXXXXXX%2Fdevices%2FRYK1&et=4763565690&method=sha1&sign=XXXXXXXXXXXXXXXXXX%3D"                           // MQTT测试用户密码#define APP_DEMO_MQTT_KEEPALIVE 120                                               // MQTT测试长连接KEEPALIVE心跳间隔#define APP_DEMO_MQTT_SUB_TOPIC "/thing/property/set" // MQTT接收订阅topic demo仅订阅一个  可自行修改代码 订阅多个#define APP_DEMO_MQTT_SUB_TOPIC2 "/thing/property/post/reply" // MQTT接收订阅topic demo仅订阅一个  可自行修改代码 订阅多个#define APP_DEMO_MQTT_PUB_TOPIC "/thing/property/post" // MQTT推送topic#define APP_DEMO_MQTT_PUB_TOPIC2 "/thing/property/post" // MQTT推送topic/*测试变量区,请修改以上参数*/

6、  ML307R链接onenet平台成功-接收数据成功

下面为接收onenet平台数据的ML307R调试log日志:

[ cmlog ][OPENCPU]:[CM_OC][INFO][MQTT]recv:topic:$sys/XXXXXXXXX/RYK6/thing/property/set,datalen:55

[ cmlog ][OPENCPU]:[APP_DEMO][INFO]qujztest66,payloadlen:{"id":"20","version":"1.0","params":{"ctrlpin":"0010"}}

[ cmlog ][OPENCPU]:[APP_DEMO][INFO]qujztest66,payloadlen:{"id":"22","version":"1.0","params":{"ctrlpin":"0011"}}

7、  timer定时器调试

timer定时器参考下面历程,用于如意控项目定时刷新信号强度,定时刷新IO口状态,定时刷新ADC值、定时刷新模组基站经纬度位置等信息。

注意:千万注意!!!

如下图定时器不能添加串口log打印报错

8、  操作系统--OS程序学习

● osThreadId_t:线程ID,用于标识一个线程。

osThreadId_t 用于标识和引用 RTOS 中的一个线程。这个标识符可以在创建线程时获得,并且可以用于后续的操作,例如终止线程、获取线程状态等。

● osTimerId_t:定时器ID,用于标识一个定时器。

osTimerId_t 是实时操作系统(RTOS)中用于标识定时器的类型。sTimerId_t 用于标识和引用 RTOS 中的一个定时器。这个标识符可以在创建定时器时获得,并且可以用于后续的操作,例如启动、停止和删除定时器。

● osEventFlagsId_t:事件标志ID,用于标识一组事件标志。

osEventFlagsId_t 用于标识和引用 RTOS 中的一个事件标志组。这个标识符可以在创建事件标志组时获得,并且可以用于后续的操作,例如设置、清除、等待和读取事件标志。

● osMutexId_t:互斥锁ID,用于标识一个互斥锁。

osMutexId_t 用于标识和引用 RTOS 中的一个互斥锁。这个标识符可以在创建互斥锁时获得,并且可以用于后续的操作,例如获取、释放和删除互斥锁。

● osSemaphoreId_t:信号量ID,用于标识一个信号量。

osSemaphoreRelease 是实时操作系统(RTOS)中用于释放信号量的函数。信号量是一种同步机制,通常用于控制对共享资源的访问或协调多个线程/任务之间的操作。在许多 RTOS 中,例如 FreeRTOS 或者 CMSIS-RTOS,信号量可以用来实现互斥锁、计数信号量等功能。

● osMemoryPoolId_t:内存池ID,用于标识一个内存池。

● osMessageQueueId_t:消息队列ID,用于标识一个消息队列。

osMessageQueueId_t 用于标识和引用 RTOS 中的一个消息队列。这个标识符可以在创建消息队列时获得,并且可以用于后续的操作,例如发送、接收和删除消息队列。

● 实时操作系统(RTOS)中Event、 Semaphore、 Mutex 、 MessageQueue区别于用法?

在实时操作系统(RTOS)中,事件(Event)、互斥锁(Mutex)和消息队列(Message Queue)是常见的同步和通信机制。它们各自有不同的用途和特性,适用于不同的场景。下面是这三种机制的区别和用法:

1. 事件(Event)

定义:事件是一种简单的同步机制,用于通知任务某些条件已经满足或某个操作已经完成。

特点

● 轻量级:事件通常占用较少的系统资源。

● 标志位:可以设置多个标志位,每个标志位代表一个特定的事件。

● 等待/触发:任务可以等待一个或多个事件的发生,而其他任务或中断可以触发这些事件。

用法

● 状态通知:当某个条件发生变化时,可以通过事件来通知相关的任务。

● 超时处理:任务可以等待事件,并设置超时时间,以避免无限期等待。

2. 信号量(Semaphore)

定义:信号量是一种同步机制,用于控制对共享资源的访问。它可以是二值信号量(0 或 1)或计数信号量(非负整数)。

特点

● 资源计数:信号量维护一个计数值,表示可用资源的数量。

● 阻塞/非阻塞:如果信号量计数值为 0,尝试获取信号量的任务会被阻塞,直到有其他任务释放信号量。

● 多任务协调:可以用于协调多个任务之间的操作。

用法

● 资源管理:确保一次只有一个任务可以访问某个资源。

● 任务同步:用于同步多个任务的操作,例如生产者-消费者问题。

3. 互斥锁(Mutex)

定义:互斥锁是一种同步机制,用于保护共享资源,确保同一时间只有一个任务可以访问该资源。

特点

● 独占性:互斥锁确保对共享资源的独占访问。

● 递归性:某些互斥锁支持递归锁定,即同一个任务可以多次获取同一个互斥锁。

● 优先级继承:互斥锁可以配置为支持优先级继承,以防止优先级反转问题。

用法

● 保护共享资源:当多个任务需要访问同一个资源时,使用互斥锁来确保一次只有一个任务可以访问该资源。

● 避免竞争条件:通过互斥锁来避免多任务并发访问导致的数据不一致问题。

4. 消息队列(Message Queue)

定义:消息队列是一种通信机制,用于在任务之间传递数据块(消息)。

特点

● 数据传递:任务可以通过消息队列传递结构化的数据。

● 缓冲区:消息队列通常有一个缓冲区,可以存储多个消息。

● 阻塞/非阻塞:发送和接收消息的操作可以是阻塞的或非阻塞的。

用法

● 任务间通信:当任务需要交换数据时,使用消息队列来传递消息。

● 解耦合:通过消息队列,任务之间的耦合度降低,提高了系统的可维护性和扩展性。

总结

● 事件:用于简单地通知任务某个条件已经满足或某个操作已经完成。

● 信号量:用于控制对共享资源的访问,确保一次只有一个任务可以访问某个资源。

● 互斥锁:用于保护共享资源,确保同一时间只有一个任务可以访问该资源。

● 消息队列:用于在任务之间传递结构化的数据,实现任务间的通信。

选择哪种机制取决于你的具体需求。如果你只需要简单的状态通知,事件可能就足够了;如果你需要控制对共享资源的访问,信号量是一个很好的选择;如果你需要保护共享资源并避免竞争条件,互斥锁会更合适;如果你需要在任务之间传递数据,那么消息队列会更合适。

9、  UART调试

uart0测试成功!!采用uart0,用于接收和发送串口数据数据。

测试成功

[20:35:19.721]发→◇{"name":"RYK1"}

[20:35:19.852]收←◆[ cmlog ][OPENCPU]:[APP_DEMO][INFO]qujztest

[ cmlog ][OPENCPU]:[APP_DEMO][INFO]qujztest-cjson--device_name:RYK1

[ cmlog ][OPENCPU]:[CM_OC][INFO]cm_mqtt_client_subscribe result:{"name":"RYK1"}

10、  CJSON调试

参考历程

采用下面程序把CJSON转化为字符串,用于打印。

 // 将 JSON 对象转换为字符串
    char *jsonString = cJSON_Print(jsonArray);

测试成功

uart_json=cJSON_Parse(data);uart_json = cJSON_GetObjectItem(uart_json, "token");strcpy(device_password,uart_json->valuestring);app_info_log("qujztest-cjson--device_password:%s",device_password);

11、  file文件系统调试

      该文件系统用于存储设备的name和password等需要断电长期保存的设备信息等。

注意每次文件中读取对应KEY存储字段都是整体读出数据然后再通过CJSON解析出相应字段因此每个文件尽量少存储不相关数据或者每个数据单独存储文件

用一下程序文件存储成功

hal_configfile_set_str(RYKCONFIG_FILE_TEST,"token",device_password);app_info_log("qujztest-cjson--device_password:%s",device_password);

用一下程序文件读取成功

hal_configfile_get_str(RYKCONFIG_FILE_TEST,"name",device_name,sizeof(device_name));app_info_log("qujztest-cjson--device_name22:%s",device_name);hal_configfile_get_str(RYKCONFIG_FILE_TEST,"token",device_password,sizeof(device_password));app_info_log("qujztest-cjson--device_token22:%s",device_password);

12、  中移物联-oneos定位lbs

        参照demo中的lbs定位程序,用oneos定位平台,实现模组基站等位功能。

参考demo程序调试成功

//中移物联-oneos定位lbs

    app_oneos_lbs_demo_func();

[ cmlog ]cm_lbs_http_callback:3,2114767144

[ cmlog ]cm_lbs_oneospos_callback event:0

[ cmlog ][OPENCPU]:[CM_OC][INFO]get oneos lbs data success22,longitude:126.502017,latitude:45.812373

13、  获取模组运行状态信息

注意app_info_log打印日志如果分多次打印模组重启查看发现WDT看门狗定时器超时汇合到一个app_info_log 日志打印以后不重启

        // app_oneos_lbs_demo_func();app_info_log("qujztest-cjson--device_name:check:%d",timer_counter);app_info_log("qujztest-s_oneos_lbs_longitude:%s",s_oneos_lbs_longitude);app_info_log("qujztest-s_oneos_lbs_latitude:%s",s_oneos_lbs_latitude);ret = cm_sys_get_sn(SN);ret = cm_sys_get_imei(IMEI);ret = cm_sim_get_imsi(IMSI);ret = hal_modem_get_iccid(ICCID, sizeof(ICCID));/* 查询信号强度 */hal_modem_get_csq(&issi, &ber);ret = cm_adc_vbat_read(&voltage_vbat);app_info_log("Q#Z vbat:%ld(mv)!!timer:%d,longitude:%s,latitude:%s,SN:%s,IMEI:%s,IMSI:%s,ICCID:%s,issi:%ld\n",voltage_vbat,timer_counter,s_oneos_lbs_longitude,s_oneos_lbs_latitude,SN,IMEI,IMSI,ICCID,issi);

调试成功

输出结果(以下设备信息我就不打马赛克了,希望朋友们手下留情!!)

[ cmlog ][OPENCPU]:[APP_DEMO][INFO]Q#Z vbat:3550(mv)!!timer:21,longitude:126.498037,latitude:45.815884,SN:20214M0001543L057943,IMEI:864979076391036,IMSI:460087436816288,ICCID:898604F4152391196288,issi:21

14、  gpio引脚配置及程序开发

引脚复用功能资料

/*IOMUX FUNC  definition */typedef enum{CM_IOMUX_FUNC_FUNCTION0 ,         /*!<不支持*/CM_IOMUX_FUNC_FUNCTION1,          /*!<功能1*/CM_IOMUX_FUNC_FUNCTION2,          /*!<功能2*/CM_IOMUX_FUNC_FUNCTION3,          /*!<功能3*/CM_IOMUX_FUNC_FUNCTIONNUM_END,} cm_iomux_func_e;

void app_gpio_init(void){//引脚控制  CM_GPIO_NUM_0// CM_GPIO_NUM_0 // gpio 0// cm_gpio_set_level(UPDATER_LCD_BL_GPIO, CM_GPIO_LEVEL_HIGH);cm_gpio_cfg_t cfg = {.direction = CM_GPIO_DIRECTION_OUTPUT,.pull = CM_GPIO_PULL_UP};// /* 初始化gpio */// cm_gpio_init(UPDATER_LCD_BL_GPIO, &cfg);// cfg.direction = CM_GPIO_DIRECTION_INPUT;cm_iomux_set_pin_func(CM_IOMUX_PIN_0, CM_IOMUX_FUNC_FUNCTION1);cm_iomux_set_pin_func(CM_IOMUX_PIN_2, CM_IOMUX_FUNC_FUNCTION1);/* 初始化gpio */cm_gpio_init(CM_IOMUX_PIN_0, &cfg);cm_gpio_init(CM_IOMUX_PIN_2, &cfg);// cm_gpio_set_level(CM_IOMUX_PIN_0, CM_GPIO_LEVEL_HIGH);// cm_gpio_set_level(CM_IOMUX_PIN_2, CM_GPIO_LEVEL_HIGH);cm_gpio_set_level(CM_IOMUX_PIN_0, CM_GPIO_LEVEL_LOW);cm_gpio_set_level(CM_IOMUX_PIN_2, CM_GPIO_LEVEL_LOW);}

gpio初始化成功

程序中引脚置低,或者置高,用万用表测量引脚输出正常。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【实战指南】Vue.js 介绍组件数据绑定路由构建高效前端应用

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

G1 GAN生成MNIST手写数字图像

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 G1 GAN生成MNIST手写数字图像 1. 生成对抗网络 (GAN) 简介 生成对抗网络 (GAN) 是一种通过“对抗性”学习生成数据的深度学习模型&#xff0c;通常用于生成…

SQL Injection | SQL 注入概述

关注这个漏洞的其他相关笔记&#xff1a;SQL 注入漏洞 - 学习手册-CSDN博客 0x01&#xff1a;SQL 注入漏洞介绍 SQL 注入就是指 Web 应用程序对用户输入数据的合法性没有判断&#xff0c;前端传入后端的参数是可控的&#xff0c;并且参数会带入到数据库中执行&#xff0c;导致…

CCS字体、字号更改+CCS下载官方链接

Step1、 按照图示箭头操作 step2 Step3 点击确定&#xff0c;点击Apply(应用)&#xff0c;点击Apply and close(应用和关闭) 4、历代版本下载链接 CCS下载&#xff1a;官方链接https://www.ti.com/tool/CCSTUDIO The last but not least 如果成功的解决了你的问题&#x…

MEMC功能详解

文章目录 MEMC的工作原理&#xff1a;优点&#xff1a;缺点&#xff1a;适用场景&#xff1a;1. Deblur&#xff08;去模糊&#xff09;2. Dejudder&#xff08;去抖动&#xff09;总结两者区别&#xff1a; MEMC&#xff08;Motion Estimation and Motion Compensation&#x…

【开源免费】基于SpringBoot+Vue.JS房屋租赁系统(JAVA毕业设计)

本文项目编号 T 020 &#xff0c;文末自助获取源码 \color{red}{T020&#xff0c;文末自助获取源码} T020&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

编码方式知识整理【ASCII、Unicode和UTF-8】

编码方式 一、ASCII编码二、Unicode 编码三、UTF-8编码四、GB2312编码五、GBK编码 计算机中对数据的存储为二进制形式&#xff0c;但采用什么样的编码方式存储&#xff0c;效率更高。主要编码方式有 ASCII、Unicode、UTF-8等。 英文一般为1个字节&#xff0c;汉字一般为3个字节…

代码复现(五):GCPANet

文章目录 net.py1.class Bottleneck&#xff1a;残差块2.class ResNet&#xff1a;特征提取3.class SRM&#xff1a;SR模块4.class FAM&#xff1a;FIA模块5.class CA&#xff1a;GCF模块6.class SA&#xff1a;HA模块7.class GCPANet&#xff1a;网络架构 train.pytest.py 论文…

【数学二】一元函数积分学-定积分的应用-平面图形面积、旋转体体积、函数的平均值、平面曲线的弧长、旋转曲面面积

考试要求 1、理解原函数的概念&#xff0c;理解不定积分和定积分的概念. 2、掌握不定积分的基本公式&#xff0c;掌握不定积分和定积分的性质及定积分中值定理&#xff0c;掌握换元积分法与分部积分法. 3、会求有理函数、三角函数有理式和简单无理函数的积分. 4、理解积分上限…

进程与线程的区别

1.进程的简单了解 进程是计算机中程序在某个数据集合上的一次运行活动&#xff0c;是操作系统进行资源分配和调度的基本单位。 从不同角度来看&#xff1a; ● 资源分配角度&#xff1a;进程拥有独立的内存地址空间、系统资源&#xff08;如 CPU 时间、文件描述符等&#xf…

【OD】【E卷】【真题】【100分】光伏场地建设规划(PythonJavajavaScriptC++C)

题目描述 祖国西北部有一片大片荒地&#xff0c;其中零星的分布着一些湖泊&#xff0c;保护区&#xff0c;矿区; 整体上常年光照良好&#xff0c;但是也有一些地区光照不太好。 某电力公司希望在这里建设多个光伏电站&#xff0c;生产清洁能源对每平方公里的土地进行了发电评…

关于测试翻译准确率的相关方法

本文提到的翻译准确率测试指标是BLEU&#xff0c;以及使用Python库-fuzzywuzzy来计算相似度 一、基于BLEU值评估 1.只评估一段话&#xff0c;代码如下 from nltk.translate.bleu_score import sentence_bleu, SmoothingFunction# 机器翻译结果 machine_translation "Ho…

【动手学深度学习】8.3 语言模型(个人向笔记)

下面是语言模型的简介 1. 学习语言模型 使用计数来建模 N元语法&#xff1a;这里的元可以理解为我们之前的时间变量。对于 N 元语法&#xff0c;我们可以把所有长度为 N 的子序列存下来。其中 1 元语法用的很少。这里其实就是算概率的时候我们不往前看所有的概率&#xff0c;…

ACL和NAT

一、ACL 1.概述 访问控制列表Access Control List是由一系列permit或deny语句组成的、有序规则的列表是一个匹配工具&#xff0c;对报文进行匹配和区分 2.ACL应用 匹配流量在traffic-filter中被调用在NAT(Natwork Address Translation)中被调用在路由策略中被调用在防火墙的…

Linux系统:本机(物理主机)访问不了虚拟机中的apache服务问题的解决方案

学习目标&#xff1a; 提示&#xff1a;本文主要讲述-本机(物理主机)访问不了虚拟机中的apache服务情况下的解决方案 Linux系统&#xff1a;Ubuntu 23.04&#xff1b; 文中提到的“本机”&#xff1a;代表&#xff0c;宿主机&#xff0c;物理主机&#xff1b; 首先&#xff0c…

OpenCV高级图形用户界面(14)交互式地选择一个或多个感兴趣区域函数selectROIs()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 允许用户在给定的图像上选择多个 ROI。 该函数创建一个窗口&#xff0c;并允许用户使用鼠标来选择多个 ROI。控制方式&#xff1a;使用空格键或…

【Unity新闻】Unity 6 正式版发布

Unity CEO Matt Bromberg 在今天自豪地宣布&#xff0c;Unity 6 正式发布&#xff01;作为迄今为止最强大和稳定的版本&#xff0c;Unity 6 为游戏和应用开发者提供了大量的新功能和工具&#xff0c;帮助他们加速开发并提升性能。 本次正式版是6.0000.0.23f1&#xff08;LTS&a…

Django学习(三)

Django的设计模式及模板层 传统的MVC&#xff08;例如java&#xff09; Django的MTV 模板层&#xff1a; 模板加载&#xff1a; 代码&#xff1a; views.py def test_html(request):#方案一# from django.template import loader# 1. 使用loader加载模板# t loader.get_…

WIFI实现透传+接线图

单片机通过TX接WIFI模块的RX将设置的AT代码写入WIFI模块&#xff08;连接WIFI调为设备模式&#xff08;有设备&#xff0c;路由&#xff0c;双模等模式&#xff09;&#xff09; WIFI模块将响应信号通过TX通过CH340发给PC的RX 通过STC-ISP或安信可串口调试助手查看响应信息 …

Parallels Desktop20最新版本虚拟机 让双系统无缝切换成为现实!

Parallels Desktop 20最新版本虚拟机&#xff1a;让双系统无缝切换成为现实&#xff01; 嘿&#xff0c;各位小伙伴们&#xff5e;&#x1f389; 如果你是像我一样&#xff0c;既爱 Windows 又放不下 macOS 的纠结星人&#xff0c;那今天这篇分享你可要仔细看啰&#xff01;&am…