RA4M2开发涂鸦模块CBU.6--RA4M2驱动涂鸦CBU模组

  • 概述
  • 视频教学
  • 样品申请
  • 参考程序
  • 硬件准备
  • 接口
  • 生成UART
  • UART属性配置
  • R_SCI_UART_Open()函数原型
  • 回调函数user_uart_callback0 ()
  • 变量定义
  • 按键回调
  • 更新按键状态
  • DP-LED 同步
  • 长按进入配网
  • 涂鸦协议解析
  • 主循环任务调度

概述

本方案基于瑞萨 RA4M2 MCU 与涂鸦 CBU Wi-Fi & BLE 模组的无缝对接,旨在快速构建智能传感与控制终端。系统架构由 RA4M2 负责业务逻辑和外设驱动,CBU 模组提供网络接入与云端交互能力,两者通过标准串口通协议 (Tuya 通用协议) 完整实现产品功能上报与命令下发。

最近在瑞萨RA的课程,需要样片的可以加qun申请:925643491。

在这里插入图片描述

视频教学

https://www.bilibili.com/video/BV1ETMBzrEVt

RA4M2开发涂鸦模块CBU(6)----RA4M2驱动涂鸦CBU模组

样品申请

https://www.wjx.top/vm/rCrkUrz.aspx

参考程序

https://github.com/CoreMaker-lab/RA4M2_TUYA_CBU

https://gitee.com/CoreMaker/RA4M2_TUYA_CBU

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
主控为R7FA4M2AD3CFL#AA0

在这里插入图片描述

这里使用的无线硬件是涂鸦CBU模组。

在这里插入图片描述

接口

模组跳线接线方式如下。
在这里插入图片描述

接入RA4M2开发板。

在这里插入图片描述

涂鸦模组原理图如下所示。

在这里插入图片描述

这里的涂鸦可以接入RA4M2的P100和P101。

在这里插入图片描述

生成UART

点击Stacks->New Stack->Connectivity -> UART(r_sci_uart)。

在这里插入图片描述

UART属性配置

在这里插入图片描述

R_SCI_UART_Open()函数原型

故可以用 R_SCI_UART_Open()函数进行配置,开启和初始化UART。

在这里插入图片描述

故可以用 R_SCI_UART_Open()函数进行配置,开启和初始化UART。

    /* Open the transfer instance with initial configuration. */err = R_SCI_UART_Open(&g_uart0_ctrl, &g_uart0_cfg);assert(FSP_SUCCESS == err);

在这里插入图片描述

回调函数user_uart_callback0 ()

当数据发送的时候,可以查看UART_EVENT_TX_COMPLETE来判断是否发送完毕。
当数据接收的时候,可以查看UART_EVENT_RX_COMPLETE来判断是否发送完毕。
UART_EVENT_RX_CHAR:字符接收事件,当接收到一个字符时触发。

在这里插入图片描述

可以检查检查 “p_args” 结构体中的 “event” 字段的值是否等于 “UART_EVENT_TX_COMPLETE"或者"UART_EVENT_RX_COMPLETE"或者"UART_EVENT_RX_CHAR”。

/* UART0——涂鸦模块:单字节接收完成标志 */
volatile bool uart_wifi_RX_flag = false;
/* UART0——涂鸦模块:发送完成标志*/
volatile bool uart_wifi_TX_flag = false;
/* UART0 接收缓存大小*/
#define UART0_LENGTH  255
/* UART0 接收环形缓冲区*/
uint8_t  TUYA_wifi_buffer[UART0_LENGTH];
/* 已接收字节计数(环形缓存写指针)*/
uint32_t UART0_TUYA_LENGTH = 0;
/* 解析到一帧有效数据后置位,主循环里解析后需清零 */
uint32_t UART0_TUYA_flag = 0;/****************************************************************** UART0 回调:RX/TX/单字符事件处理*****************************************************************/
void user_uart_callback0(uart_callback_args_t *p_args)
{/* 整帧接收完成(需在 R_SCI_UART_Receive 调用后才会产生)*/if(p_args->event == UART_EVENT_RX_COMPLETE){uart_wifi_RX_flag = true;}/* 发送完成 */else if(p_args->event == UART_EVENT_TX_COMPLETE){uart_wifi_TX_flag = true;}/* 接收到 1 个字符*/else if(p_args->event == UART_EVENT_RX_CHAR){/* 缓冲未满则写入*/if (sizeof(TUYA_wifi_buffer) > UART0_TUYA_LENGTH){/* 仅在数据位 ≥ 8bit 时写入 1 字节 */if (UART_DATA_BITS_8 >= g_uart0_cfg.data_bits){TUYA_wifi_buffer[UART0_TUYA_LENGTH++] = (uint8_t) p_args->data;}/* —— 以下为简单的涂鸦帧快速判定逻辑,可改为状态机 —— *//* 帧头非 0x55 则丢弃当前字节(回溯 1 位)*/if(TUYA_wifi_buffer[00]!=0x55)UART0_TUYA_LENGTH--;/* 普通指令帧长度 ≥ 7 且 CMD ≠ 0x07 时,即可认为一帧完 */if(UART0_TUYA_LENGTH>=7 && TUYA_wifi_buffer[3]!=0x06)UART0_TUYA_flag=1;/* CMD = 0x06(DP 下发)需根据数据点判断长度*/if(TUYA_wifi_buffer[3]==0x06){/* DP-ID 0x65:亮度,数据长度 0x0004 -> 总长 ≥ 15 */if(TUYA_wifi_buffer[6]==0x65 && UART0_TUYA_LENGTH>=15)//亮度值UART0_TUYA_flag=1;/* DP-ID 0x66:开关,数据长度 0x0001 -> 总长 ≥ 12 */else if(TUYA_wifi_buffer[6]==0x66 && UART0_TUYA_LENGTH>=12)//开关UART0_TUYA_flag=1;}}}
}

在这里插入图片描述

变量定义

/****************************************************************** 与涂鸦协议相关的工作变量/固定协议帧 * *****************************************************************/uint8_t wifi_first =0;/* 0:第一次心跳;1:第二次心跳     */
uint32_t wifi_num =0;//如果心跳频繁发送,可能是触发了复位,需要重新发送buff1,这里2秒内多次发送心跳指令则认为重启
/* ---- 固定格式下行帧:MCU 主动发送给涂鸦模块 ----------------- */
const uint8_t g_tuya_heartbeat1[8]={0x55,0xAA,0x03,0x00,0x00,0x01,0x00,0x03};//心跳检测,第1次 0x55 aa 00 00 00 01 00 03
const uint8_t g_tuya_heartbeat2[8]={0x55,0xAA,0x03,0x00,0x00,0x01,0x01,0x04};//心跳检测,第2次 0x55 aa 00 00 00 01 01 04
const uint8_t g_tuya_wifi_cfg[8]={0x55,0xAA,0x03,0x05,0x00,0x01,0x01,0x09};//WIFI配网
//0x55, 0xAA, 0x03, 0x01 (帧头)
//0x00, 0x2A       (长度)
//0x7B, 0x22, 0x70, 0x22, 0x3A, 0x22 ({"p":")
//0x78, 0x68, 0x6E, 0x7A, 0x74, 0x79, 0x64, 0x67, 0x77, 0x64, 0x63, 0x67, 0x6B, 0x71, 0x78, 0x64 (xhnztydgwdcgkqxd)
//0x22, 0x2C, 0x22, 0x76, 0x22, 0x3A, 0x22 (","v":")
//0x31, 0x2E, 0x30, 0x2E, 0x30  (1.0.0)
//0x22, 0x2C, 0x22, 0x6D, 0x22, 0x3A (","m":)
//0x30  (0)
//0x7D(})
//0xC(校验码)
uint8_t g_tuya_product_info[49]={0x55, 0xAA, 0x03, 0x01,0x00, 0x2A,0x7B, 0x22, 0x70, 0x22, 0x3A, 0x22,0x78, 0x68, 0x6E, 0x7A, 0x74, 0x79, 0x64, 0x67, 0x77, 0x64, 0x63, 0x67, 0x6B, 0x71, 0x78, 0x64,0x22, 0x2C, 0x22, 0x76, 0x22, 0x3A, 0x22,0x31, 0x2E, 0x30, 0x2E, 0x30,0x22, 0x2C, 0x22, 0x6D, 0x22, 0x3A,0x30,0x7D,0xCC};//接收模块发送的查询产品信息请求const uint8_t g_tuya_query_mode[8]={0x55,0xaa,0x03,0x02,0x00,0x00,0x04};//查询工作模式
uint32_t wifi_ap_num =0;//wifi重置计时
const uint8_t g_tuya_rpt_net[8]={0x55,0xaa,0x03,0x03,0x00,0x00,0x05};//报告设备联网状态uint32_t wifi_Update=0;//wifi发送标志位
uint32_t wifi_Rx=0;//wifi接收指令标志位
uint32_t LED_PWM_num=10;//亮度值
/* DP-ID 0x65:亮度值 */
uint8_t g_tuya_dp_pwm[15]={0x55,0xAA,0x03,0x07,0x00,0x08,0x65,0x02,0x00,0x04,0x00,0x00,0x00,0x0A,0x86};//MCU亮度
bool LED_open=0; /* LED 开关:0=OFF,1=ON                   */
/* DP-ID 0x66:开关   */
uint8_t g_tuya_dp_switch[12]={0x55,0xAA,0x03,0x07,0x00,0x05,0x66,0x01,0x00,0x01,0x00,0x76};//MCU上报开关状态

在这里插入图片描述

按键回调

更新按键中断external_irq4_callback,当按下的时候需要告知无线模块,无线模块进行上报,这里定义当按键按下时候button_flag为1,让无线模组进行上报。

/** @brief 由中断回调函数切换的外部中断标志 */
static volatile bool s_ext_irq_flag = false;
bool button_flag =0;
/*** @brief 外部中断 IRQ4 回调函数** 当 ICU 外部中断发生时调用,切换外部中断标志。** @param[in] p_args 中断回调参数(未使用)*/
void external_irq4_callback(external_irq_callback_args_t *p_args)
{(void)p_args;s_ext_irq_flag = !s_ext_irq_flag;button_flag=1;LED_open=!LED_open;
}

在这里插入图片描述

更新按键状态

在原有基础上增加wifi_Update变量,这样每次使用按键之后都可以上报到云端。

/*** @brief 根据中断标志更新 LED 输出** 根据 s_ext_irq_flag 状态设置指定 IOPORT 引脚高低电平。*/
static inline void led_update(void)
{
//    R_IOPORT_PinWrite(&g_ioport_ctrl,
//                      BSP_IO_PORT_01_PIN_04,
//                      s_ext_irq_flag ? BSP_IO_LEVEL_HIGH : BSP_IO_LEVEL_LOW);if(button_flag){button_flag=0;wifi_Update=1;R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04, LED_open);}
}

在这里插入图片描述

DP-LED 同步

该函数先检查 wifi_Update 标志,若需上报,则:

  1. 本地硬件同步
    ○ 调整 GPT2 定时器占空比以设置 LED 呼吸灯亮度。
  2. 构建并发送涂鸦 DP-亮度帧
    ○ 填充 g_tuya_dp_pwm 数组中的亮度字段并校验。
    ○ 通过 UART0 向涂鸦模块下发亮度变化数据点。
  3. 构建并发送涂鸦 DP-开关帧
    ○ 更新 g_tuya_dp_switch 中的开关字段并校验。
    ○ 通过 UART0 向涂鸦模块下发 LED 开关状态。
    整个流程实现了“本地 LED 状态 → MCU 构造涂鸦数据帧 → Wi-Fi 模块上报至云端”的闭环同步。
/******************************************************************************************************************** @brief 向涂鸦模块上报最新 DP 数据 & 本地硬件同步*******************************************************************************************************************/
void tuya_wifi_Update(void)
{if(wifi_Update){printf("wifi_Update\n");wifi_Update=0;/*更新 GPT 占空比 ---------------------------------------*//* 计数器周期在 FSP 配置为 9000(举例),因此 1% 亮度 = 9000 / 1000 = 9 个计数。                  */fsp_err_t err = R_GPT_DutyCycleSet(&g_timer2_ctrl,9000-LED_PWM_num * 9,           // 新比较值GPT_IO_PIN_GTIOCA);  // 使用 A 通道assert(FSP_SUCCESS == err);/* 更新 DP 帧 ------------------------------------------------------*/g_tuya_dp_pwm[12]=LED_PWM_num>>8;g_tuya_dp_pwm[13]=LED_PWM_num;g_tuya_dp_pwm[14]=0x86-0x0A+g_tuya_dp_pwm[12]+g_tuya_dp_pwm[13];/*发送 DP-亮度 */printf("[MCU] -> TUYA DP_PWM = %d\r\n",LED_PWM_num);err = R_SCI_UART_Write(&g_uart0_ctrl, g_tuya_dp_pwm, 15);if(FSP_SUCCESS != err) __BKPT();while(uart_wifi_TX_flag == false){}uart_wifi_TX_flag = false;/*发送 DP-开关 */printf("[MCU] -> TUYA DP_SW=%d\r\n",LED_open);g_tuya_dp_switch[10]=LED_open;g_tuya_dp_switch[11]=0x76+g_tuya_dp_switch[10];//上报LED开关err = R_SCI_UART_Write(&g_uart0_ctrl, g_tuya_dp_switch, 12);if(FSP_SUCCESS != err) __BKPT();while(uart_wifi_TX_flag == false){}uart_wifi_TX_flag = false;}}

在这里插入图片描述

长按进入配网

该函数检测按键引脚状态,累计长按时间。当按键持续按下达到 3 秒(3000 次 1 ms 延时)时,触发一次配网模式:

  1. 打印日志 [BTN] wifi_ap_mode
  2. 通过 UART0 向涂鸦模块发送配网指令帧 g_tuya_wifi_cfg(0x05 命令)。
    短按或松开时则重置计时,避免误触发。
/******************************************************************************************************************** @brief 长按按键 3 s 进入配网模式 (发送 0x05 命令)*******************************************************************************************************************/
void button_wifi_ap(void)
{//  wifi_ap_numbsp_io_level_t p_port_value_pin_111;R_IOPORT_PinRead(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_11, &p_port_value_pin_111);if(p_port_value_pin_111)/* 松开 */wifi_ap_num=0;else//长按3s复位wifi{if(wifi_ap_num<3000)wifi_ap_num++;else if(wifi_ap_num==3000){wifi_ap_num++;printf("[BTN] wifi_ap_mode\r\n");fsp_err_t err = R_SCI_UART_Write(&g_uart0_ctrl, g_tuya_wifi_cfg, 8);if(FSP_SUCCESS != err) __BKPT();while(uart_wifi_TX_flag == false){}uart_wifi_TX_flag = false;}}
}

在这里插入图片描述

涂鸦协议解析

该函数在接收到完整一帧涂鸦数据后,

  1. 校验帧头与版本,确认有效帧;
  2. 根据 CMD 字段(frame[3])分支:
    ○ 0x00:心跳请求,打印 [TUYA] 并交替发送两种心跳应答;
    ○ 0x01:查询产品信息,打印 [TUYA] 并发送产品信息帧;
    ○ 0x02:查询工作模式,打印 [TUYA] 并发送工作模式帧;
    ○ 0x03:网络状态上报,打印 [TUYA] <WIFI_MODE=XX> 并回复网络状态帧,同时在已连云时置 wifi_Update;
    ○ 0x06:DP 下发,打印 [TUYA] <DP-switch=ON/OFF> 或 [TUYA] <DP-PWM=值>,更新本地 LED 状态与亮度,并置 wifi_Update。
  3. 清空接收缓存,为下一帧解析复位。
/******************************************************************************************************************** @brief 解析完成后,根据 CMD 打印清晰友好的日志*******************************************************************************************************************/
void uart0_tuya(void)
{if(UART0_TUYA_flag ==1)//接收完成标志{fsp_err_t err = FSP_SUCCESS;UART0_TUYA_flag=0;if(TUYA_wifi_buffer[0]==0x55&&TUYA_wifi_buffer[1]==0xAA)//判断帧头和版本{if(TUYA_wifi_buffer[3]==0x00)//判断是否为心跳检测{printf("[TUYA] <heartbeat(SEQ=%u)\r\n", wifi_first);
//                if(wifi_num<2000&&wifi_first==1)//频繁发送心跳指令,认为重启
//                {
//                    wifi_first=0;
//                   }
//                wifi_num=0;if(wifi_first==0)//第一次发送心跳数据{wifi_first=1;//心跳检测,向涂鸦模块发送err = R_SCI_UART_Write(&g_uart0_ctrl, g_tuya_heartbeat1, 8);if(FSP_SUCCESS != err) __BKPT();while(uart_wifi_TX_flag == false){}uart_wifi_TX_flag = false;}else{//心跳检测,向涂鸦模块发送err = R_SCI_UART_Write(&g_uart0_ctrl, g_tuya_heartbeat2, 8);if(FSP_SUCCESS != err) __BKPT();while(uart_wifi_TX_flag == false){}uart_wifi_TX_flag = false;}}else if(TUYA_wifi_buffer[3]==0x01)//接收模块发送的查询产品信息请求{printf("[TUYA] <Query Product Information\r\n");//接收模块发送的查询产品信息请求,向涂鸦模块发送err = R_SCI_UART_Write(&g_uart0_ctrl, g_tuya_product_info, 49);if(FSP_SUCCESS != err) __BKPT();while(uart_wifi_TX_flag == false){}uart_wifi_TX_flag = false;}else if(TUYA_wifi_buffer[3]==0x02)//查询工作模式{printf("[TUYA] <Query Work Mode\r\n");//查询工作模式,向涂鸦模块发送err = R_SCI_UART_Write(&g_uart0_ctrl, g_tuya_query_mode, 8);if(FSP_SUCCESS != err) __BKPT();while(uart_wifi_TX_flag == false){}uart_wifi_TX_flag = false;}else if(TUYA_wifi_buffer[3]==0x03)//报告设备联网状态{printf("[TUYA] <WIFI_MODE=%02X\r\n", TUYA_wifi_buffer[6]);//查询工作模式,向涂鸦模块发送err = R_SCI_UART_Write(&g_uart0_ctrl, g_tuya_rpt_net, 8);if(FSP_SUCCESS != err) __BKPT();while(uart_wifi_TX_flag == false){}uart_wifi_TX_flag = false;if(TUYA_wifi_buffer[6]==0x04)//已连上路由器且连接到云端{wifi_Update=1;//wifi跟新标志位}}else if(TUYA_wifi_buffer[3]==0x06)//接收模块DP下发信息{if(TUYA_wifi_buffer[6]==0x66)//LED开关{wifi_Update=1;//wifi跟新标志位LED_open=TUYA_wifi_buffer[10];button_flag=1;printf("[TUYA] <DP-switch=%s\r\n", LED_open ? "ON" : "OFF");}else if(TUYA_wifi_buffer[6]==0x65)//LED亮度值{wifi_Update=1;//wifi跟新标志位LED_PWM_num=0;LED_PWM_num+=TUYA_wifi_buffer[13];LED_PWM_num+=TUYA_wifi_buffer[12]*256;printf("[TUYA] <DP-PWM=%ld\r\n", LED_PWM_num);}}}// 清除数组memset(TUYA_wifi_buffer, 0, UART0_LENGTH);// 同时把当前有效长度归零UART0_TUYA_LENGTH = 0;}
}

在这里插入图片描述

主循环任务调度

在主循环中依次执行以下任务:

  1. LED 更新(led_update())— 处理普通按键翻转 LED;
  2. 涂鸦数据上报(tuya_wifi_Update())— 若有变更则同步 DP 数据;
  3. 配网按键检测(button_wifi_ap())— 长按 3 s 触发 Wi-Fi 配网命令;
  4. 涂鸦协议解析(uart0_tuya())— 解析并响应下行命令;
    /* 主循环 */while (true){led_update();             /* 切换普通 LED */
//        pwm_breathe_update();     /* 呼吸灯效果 */tuya_wifi_Update(); /* 涂鸦数据上报 */button_wifi_ap();   /* 配网按键检测 */uart0_tuya();       /* 涂鸦协议解析 */R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS);}

在这里插入图片描述

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

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

相关文章

MiniMax-M1: Scaling Test-TimeCompute Efficiently with I Lightning Attention

我们推出了MiniMax-M1&#xff0c;这是全球首个开源权重、大规模混合注意力推理模型。MiniMax-M1采用了混合专家系统&#xff08;Mixture-of-Experts&#xff0c;简称MoE&#xff09;架构&#xff0c;并结合了闪电注意力机制。该模型是在我们之前的MiniMax-Text-01模型&#xf…

Appium+python自动化(二十六) -Toast提示

在日常使用App过程中&#xff0c;经常会看到App界面有一些弹窗提示&#xff08;如下图所示&#xff09;这些提示元素出现后等待3秒左右就会自动消失&#xff0c;那么我们该如何获取这些元素文字内容呢&#xff1f; Toast简介 Android中的Toast是一种简易的消息提示框。 当视图…

【信号与系统三】离散时间傅里叶变换

上一讲我们讲述了连续时间傅里叶变换&#xff0c;这一讲同理来个离散时间傅里叶变换。 和上讲模块类似 5.1离散时间傅里叶变换 这一式子就是离散时间傅里叶变换对 5.2周期信号的傅里叶变换 同理&#xff0c;由于之前第一讲讲到&#xff1a; 可以推出&#xff1a; 举个例子&am…

Python应用石头剪刀布练习初解

大家好!作为 Python 初学者&#xff0c;寻找一个既简单又有趣的项目来练习编程技能是至关重要的。今天&#xff0c;我将向大家介绍一个经典的编程练习——石头剪刀布游戏&#xff0c;它可以帮助你掌握 Python 的基本概念&#xff0c;如条件语句、随机数生成和用户输入处理等。 …

私有规则库:企业合规与安全的终极防线

2.1 为什么企业需要私有规则库?——合规与安全的最后防线 真实案例:2023年某跨境电商因员工泄露内部检测规则,导致黑产绕过风控系统,损失1200万+ 企业规则库的三大刚需: 行业合规: 金融行业需符合《个人金融信息保护技术规范》 医疗行业需满足HIPAA患者数据脱敏要求 业…

长尾关键词优化SEO核心策略

内容概要 本文旨在系统解析长尾关键词在搜索引擎优化中的核心地位&#xff0c;为读者提供从理论到实践的全面指南。文章首先探讨长尾关键词的基础作用&#xff0c;帮助理解其在提升网站流量质量中的价值。接着&#xff0c;深入介绍精准定位低搜索量、高转化率关键词的策略&…

腾讯云事件总线:构建毫秒级响应的下一代事件驱动架构

摘要 事件总线&#xff08;EventBridge&#xff09;作为云原生架构的核心枢纽&#xff0c;其性能与可靠性直接影响企业系统弹性。腾讯云事件总线基于TGW云网关底层能力重构&#xff0c;实现单节点吞吐量提升125%、故障恢复时间降至4秒级&#xff08;行业平均>30秒&#xff0…

PyTorch 中mm和bmm函数的使用详解

torch.mm 是 PyTorch 中用于 二维矩阵乘法&#xff08;matrix-matrix multiplication&#xff09; 的函数&#xff0c;等价于数学中的 A B 矩阵乘积。 一、函数定义 torch.mm(input, mat2) → Tensor执行的是两个 2D Tensor&#xff08;矩阵&#xff09;的标准矩阵乘法。 in…

Qt 解析复杂对象构成

Qt 解析复杂对象构成 dumpStructure 如 QComboBox / QCalendarWidget / QSpinBox … void Widget::Widget(QWidget* parent){auto c new QCalendarWidget(this);dumpStructure(c,4); }void Widget::dumpStructure(const QObject *obj, int spaces) {qDebug() << QString…

山姆·奥特曼:从YC到OpenAI,硅谷创新之星的崛起

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 山姆奥特曼&#xff1a;从YC到OpenAI&#xff0c;硅谷创新之星的崛起 在人工智能革命…

PHP语法基础篇(五):流程控制

任何 PHP 脚本都是由一系列语句构成的。一条语句可以是一个赋值语句&#xff0c;一个函数调用&#xff0c;一个循环&#xff0c;一个条件语句或者甚至是一个什么也不做的语句&#xff08;空语句&#xff09;。语句通常以分号结束。此外&#xff0c;还可以用花括号将一组语句封装…

怎么隐藏关闭或恢复显示输入法的悬浮窗

以搜狗输入法为例&#xff0c;隐藏输入法悬浮窗 悬浮窗在输入法里的官方叫法为【状态栏】。 假设目前大家的输入法相关显示呈现如下状态&#xff1a; 那我们只需在输入法悬浮窗&#xff08;状态栏&#xff09;的任意位置鼠标右键单击&#xff0c;调出输入法菜单&#xff0c;就…

Electron (02)集成 SpringBoot:服务与桌面程序协同启动方案

本篇是关于把springboot生成的jar打到electron里&#xff0c;在生成的桌面程序启动时springboot服务就会自动启动。 虽然之后并不需要这种方案&#xff0c;更好的是部署[一套服务端&#xff0c;多个客户端]...但是既然搭建成功了&#xff0c;也记录一下。 前端文件 1、main.js…

2025年计算机应用与神经网络国际会议(CANN 2025)

2025 International Conference on Computer Applications and Neural Networks &#xff08;一&#xff09;会议信息 会议简称&#xff1a;CANN 2025 大会地点&#xff1a;中国重庆 收录检索&#xff1a;提交Ei Compendex,CPCI,CNKI,Google Scholar等 &#xff08;二&#x…

振动分析中的低频噪声问题:从理论到实践的完整解决方案

前言 在振动监测和结构健康监测领域&#xff0c;我们经常需要从加速度信号计算速度和位移。然而&#xff0c;许多工程师在实际应用中都会遇到一个令人困扰的问题&#xff1a;通过积分计算得到的速度和位移频谱中低频噪声异常放大。 本文将深入分析这个问题的根本原因&#xf…

ncu学习笔记01——合并访存

全局内存通过缓存实现加载和存储过程。其中&#xff0c;L1为一级缓存&#xff0c;每个SM都有自己的L1&#xff1b;L2为二级缓存&#xff0c;L2则被所有SM共有。 数据从全局内存到SM的传输过程中&#xff0c;会去L1和L2中查询是否有缓存。对全局内存的访问将经过L1&#xff1b;…

2012 - 正方形矩阵

​​​​题目描述 晶晶同学非常喜欢方形&#xff0c;她希望打印出来的字符串也是方形的。老师给了晶晶同学一个字符串"ACM"&#xff0c;晶晶同学突发奇想&#xff0c;如果任意给定义一个整数n&#xff0c;能不能打印出由这个字符串组成的正方形字符串呢&#xff1f;…

C++中set的常见用法

在 C 里&#xff0c;std::set属于标准库容器的一种&#xff0c;其特性是按照特定顺序存储唯一的元素。下面为你详细介绍它的常见使用方法&#xff1a; 1. 头文件引入 要使用std::set&#xff0c;需要在代码中包含相应的头文件&#xff1a; #include <set> 2. 集合的定…

stm32移植freemodbus

1、设置串口 开启串口中断 2、设置定时器 已知在freemodbus中默认定义&#xff1a;当波特率大于19200时&#xff0c;判断一帧数据超时时间固定为1750us&#xff0c;当波特率小于19200时&#xff0c;超时时间为3.5个字符时间。这里移植的是115200&#xff0c;所以一帧数据超时…

鸿蒙next 使用canvas实现ecg动态波形绘制

该代码可在Arkts 与 前端使用&#xff0c;基于canvas 仓库地址&#xff1a;https://gitee.com/harmony_os_example/harmony-os-ecg-waveform.git 代码中的list数组为波形数据&#xff0c;该示例需要根据自己业务替换绘制频率&#xff0c;波形数据&#xff0c;ecg原始数据生成…