CH592F 2.4G 低功耗
2.4G私有协议低功耗传输tx按一下按键按键发送数据到rxrx 1s内启动10ms接收窗口进行接收。代码从github上拉取官方的代码GitHub - openwch/ch592: The SDK and HDK for RISC-V Bluetooth LE BLE5.4 CH591/CH592 · GitHub例程是ch592\EVT\EXAM\BLE\RF_PHY配置开启 HAL_SLEEP然后替换下面3个文件RF_PHY.h/********************************** (C) COPYRIGHT ******************************* * File Name : rf_phy.h * Author : WCH * Version : V1.0 * Date : 2018/11/12 * Description : ********************************************************************************* * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * Attention: This software (modified or not) and binary are used for * microcontroller manufactured by Nanjing Qinheng Microelectronics. *******************************************************************************/ #ifndef CENTRAL_H #define CENTRAL_H #ifdef __cplusplus extern C { #endif #define SBP_RF_RX_OPEN_EVT 0x0001 // 打开RX并启动接收窗口 #define SBP_RF_RX_CLOSE_EVT 0x0002 // 关闭RX并进入低功耗等待 #define SBP_RF_RX_RESTART_EVT 0x0004 // 基本模式收包后重新启动RX #define SBP_RF_TX_SEND_EVT 0x0008 // 发送一包TX数据 #define SBP_RF_TX_RX_DATA_EVT 0x0010 // 在TMOS任务中处理并打印应答数据 #define SBP_RF_KEY_IRQ_EVT 0x0020 // PA4下降沿中断投递事件 #define SBP_RF_KEY_CHECK_EVT 0x0040 // 延时10ms后检查按键电平 #define SBP_RF_TX_TIMEOUT_EVT 0x0080 // 连续发送3秒仍无应答则停止 #define LLE_MODE_ORIGINAL_RX (0x80) //如果配置LLEMODE时加上此宏则接收第一字节为原始数据原来为RSSI extern void RF_Init(void); #ifdef __cplusplus } #endif #endifRF_main.c/********************************** (C) COPYRIGHT ******************************* * File Name : main.c * Author : WCH * Version : V1.0 * Date : 2020/08/06 * Description : ********************************************************************************* * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * Attention: This software (modified or not) and binary are used for * microcontroller manufactured by Nanjing Qinheng Microelectronics. *******************************************************************************/ /******************************************************************************/ /* 头文件包含 */ #include CONFIG.h #include HAL.h #include RF_PHY.h /********************************************************************* * GLOBAL TYPEDEFS */ __attribute__((aligned(4))) uint32_t MEM_BUF[BLE_MEMHEAP_SIZE / 4]; #if(defined(BLE_MAC)) (BLE_MAC TRUE) const uint8_t MacAddr[6] {0x84, 0xC2, 0xE4, 0x03, 0x02, 0x02}; #endif /********************************************************************* * fn Main_Circulation * * brief 主循环 * * return none */ __HIGH_CODE __attribute__((noinline)) void Main_Circulation() { while(1) { TMOS_SystemProcess(); } } /********************************************************************* * fn main * * brief 主函数 * * return none */ int main(void) { #if(defined(DCDC_ENABLE)) (DCDC_ENABLE TRUE) PWR_DCDCCfg(ENABLE); #endif SetSysClock(CLK_SOURCE_PLL_60MHz); #if(defined(HAL_SLEEP)) (HAL_SLEEP TRUE) GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU); GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU); #endif #ifdef DEBUG GPIOA_SetBits(bTXD1); GPIOA_ModeCfg(bTXD1, GPIO_ModeOut_PP_5mA); UART1_DefInit(); #endif PRINT(start.\n); PRINT(%s\n, VER_LIB); CH59x_BLEInit(); HAL_Init(); RF_RoleInit(); RF_Init(); Main_Circulation(); } /******************************** endfile main ******************************/RF_PHY.c/********************************** (C) COPYRIGHT ******************************* * File Name : main.c * Author : WCH * Version : V1.0 * Date : 2020/08/06 * Description : ********************************************************************************* * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * Attention: This software (modified or not) and binary are used for * microcontroller manufactured by Nanjing Qinheng Microelectronics. *******************************************************************************/ /******************************************************************************/ /* 头文件包含 */ #include CONFIG.h #include RF_PHY.h #define RF_DEVICE_ROLE_RX 0 #define RF_DEVICE_ROLE_TX 1 #define RF_DEVICE_ROLE RF_DEVICE_ROLE_TX #if(RF_DEVICE_ROLE ! RF_DEVICE_ROLE_RX) \ (RF_DEVICE_ROLE ! RF_DEVICE_ROLE_TX) #error Invalid RF_DEVICE_ROLE #endif /********************************************************************* * GLOBAL TYPEDEFS */ #define RF_AUTO_MODE_EXAM 1 #define RF_RX_PERIOD MS1_TO_SYSTEM_TIME(1000) #define RF_RX_WINDOW MS1_TO_SYSTEM_TIME(10) #define RF_KEY_DEBOUNCE_TIME MS1_TO_SYSTEM_TIME(10) #define RF_TX_TIMEOUT_TIME MS1_TO_SYSTEM_TIME(3000) #define RF_KEY_PIN GPIO_Pin_4 typedef struct { int8_t rssi; uint8_t len; uint8_t data[251]; } rfRxPacket_t; uint8_t taskID; uint8_t ACK_DATA[2] {o, k}; uint8_t TX_DATA[10] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; volatile uint8_t tx_end_flag0; volatile uint8_t rx_end_flag0; static volatile uint8_t rx_window_openFALSE; static volatile uint8_t rx_first_packetFALSE; static volatile uint8_t rx_ack_status0; static rfRxPacket_t rx_packet; static rfRxPacket_t tx_rx_packet; static volatile uint8_t tx_runningFALSE; #if(RF_DEVICE_ROLE RF_DEVICE_ROLE_TX) /********************************************************************* * fn HAL_KeyIrqInit * * brief 配置PA4上拉输入、下降沿中断和睡眠唤醒 */ void HAL_KeyIrqInit(void) { GPIOA_ModeCfg(RF_KEY_PIN, GPIO_ModeIN_PU); GPIOA_ITModeCfg(RF_KEY_PIN, GPIO_ITMode_FallEdge); GPIOA_ClearITFlagBit(RF_KEY_PIN); PFIC_EnableIRQ(GPIO_A_IRQn); PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay); } /********************************************************************* * fn HAL_KeyIrqGet * * return 0-按下非0-释放 */ uint32_t HAL_KeyIrqGet(void) { return GPIOA_ReadPortPin(RF_KEY_PIN); } /********************************************************************* * fn GPIOA_IRQHandler * * brief PA4下降沿中断只投递事件不在中断中消抖 */ __attribute__((interrupt(WCH-Interrupt-fast))) __attribute__((section(.highcode))) void GPIOA_IRQHandler(void) { uint16_t flag R16_PA_INT_IF; if(flag RF_KEY_PIN) { GPIOA_ClearITFlagBit(RF_KEY_PIN); tmos_set_event(taskID, SBP_RF_KEY_IRQ_EVT); } } #endif /********************************************************************* * fn RF_Wait_Tx_End * * brief 手动模式等待发送完成自动模式等待发送-接收完成必须在RAM中等待等待时可以执行用户代码但需要注意执行的代码必须运行在RAM中否则影响发送 * * return none */ __HIGH_CODE __attribute__((noinline)) void RF_Wait_Tx_End() { uint32_t i0; while(!tx_end_flag) { i; __nop(); __nop(); // 约5ms超时 if(i(FREQ_SYS/1000)) { tx_end_flag TRUE; } } } /********************************************************************* * fn RF_Wait_Rx_End * * brief 自动模式等待应答发送完成必须在RAM中等待等待时可以执行用户代码但需要注意执行的代码必须运行在RAM中否则影响发送 * * return none */ __HIGH_CODE __attribute__((noinline)) void RF_Wait_Rx_End() { uint32_t i0; while(!rx_end_flag) { i; __nop(); __nop(); // 约5ms超时 if(i(FREQ_SYS/1000)) { rx_end_flag TRUE; } } } /********************************************************************* * fn RF_2G4StatusCallBack * * brief RF 状态回调此函数在中断中调用。注意不可在此函数中直接调用RF接收或者发送API需要使用事件的方式调用 * 在此回调中直接使用或调用函数涉及到的变量需注意此函数在中断中调用。 * * param sta - 状态类型 * param crc - crc校验结果 * param rxBuf - 数据buf指针 * * return none */ void RF_2G4StatusCallBack(uint8_t sta, uint8_t crc, uint8_t *rxBuf) { switch(sta) { case TX_MODE_TX_FINISH: { #if(!RF_AUTO_MODE_EXAM) tx_end_flag TRUE; #endif break; } case TX_MODE_TX_FAIL: { tx_end_flag TRUE; #if(RF_DEVICE_ROLE RF_DEVICE_ROLE_TX) if(tx_running) { tmos_set_event(taskID, SBP_RF_TX_SEND_EVT); } #endif break; } case TX_MODE_RX_DATA: { #if(RF_AUTO_MODE_EXAM) tx_end_flag TRUE; #if(RF_DEVICE_ROLE RF_DEVICE_ROLE_TX) if((crc 0) (rxBuf[1] sizeof(ACK_DATA)) (rxBuf[2] ACK_DATA[0]) (rxBuf[3] ACK_DATA[1])) { uint8_t rx_len; tx_rx_packet.rssi (int8_t)rxBuf[0]; rx_len rxBuf[1]; if(rx_len sizeof(tx_rx_packet.data)) { rx_len sizeof(tx_rx_packet.data); } tmos_memcpy(tx_rx_packet.data, rxBuf[2], rx_len); tx_rx_packet.len rx_len; tmos_set_event(taskID, SBP_RF_TX_RX_DATA_EVT); } else { if(tx_running) { tmos_set_event(taskID, SBP_RF_TX_SEND_EVT); } } #endif #endif break; } case TX_MODE_RX_TIMEOUT: // Timeout is about 200us { #if(RF_AUTO_MODE_EXAM) tx_end_flag TRUE; #if(RF_DEVICE_ROLE RF_DEVICE_ROLE_TX) if(tx_running) { tmos_set_event(taskID, SBP_RF_TX_SEND_EVT); } #endif #endif break; } case RX_MODE_RX_DATA: { if((crc 0) rx_window_open !rx_first_packet) { uint8_t rx_len; rx_first_packet TRUE; rx_packet.rssi (int8_t)rxBuf[0]; rx_len rxBuf[1]; if(rx_len sizeof(rx_packet.data)) { rx_len sizeof(rx_packet.data); } tmos_memcpy(rx_packet.data, rxBuf[2], rx_len); rx_packet.len rx_len; #if(RF_AUTO_MODE_EXAM) RF_Wait_Rx_End(); #endif } #if(!RF_AUTO_MODE_EXAM) if(rx_window_open) { tmos_set_event(taskID, SBP_RF_RX_RESTART_EVT); } #endif break; } case RX_MODE_TX_FINISH: { #if(RF_AUTO_MODE_EXAM) rx_end_flag TRUE; if(rx_first_packet) { rx_ack_status 1; tmos_set_event(taskID, SBP_RF_RX_CLOSE_EVT); } #endif break; } case RX_MODE_TX_FAIL: { #if(RF_AUTO_MODE_EXAM) rx_end_flag TRUE; if(rx_first_packet) { rx_ack_status 2; tmos_set_event(taskID, SBP_RF_RX_CLOSE_EVT); } #endif break; } } } /********************************************************************* * fn RF_ProcessEvent * * brief RF 事件处理 * * param task_id - 任务ID * param events - 事件标志 * * return 未完成事件 */ uint16_t RF_ProcessEvent(uint8_t task_id, uint16_t events) { if(events SYS_EVENT_MSG) { uint8_t *pMsg; if((pMsg tmos_msg_receive(task_id)) ! NULL) { // Release the TMOS message tmos_msg_deallocate(pMsg); } // return unprocessed events return (events ^ SYS_EVENT_MSG); } #if(RF_DEVICE_ROLE RF_DEVICE_ROLE_TX) if(events SBP_RF_KEY_IRQ_EVT) { tmos_stop_task(taskID, SBP_RF_KEY_CHECK_EVT); tmos_start_task(taskID, SBP_RF_KEY_CHECK_EVT, RF_KEY_DEBOUNCE_TIME); return events ^ SBP_RF_KEY_IRQ_EVT; } if(events SBP_RF_KEY_CHECK_EVT) { if(HAL_KeyIrqGet() 0) { PRINT(PA4 key pressed\n); if(!tx_running) { tx_running TRUE; tmos_start_task(taskID, SBP_RF_TX_TIMEOUT_EVT, RF_TX_TIMEOUT_TIME); tmos_set_event(taskID, SBP_RF_TX_SEND_EVT); } } return events ^ SBP_RF_KEY_CHECK_EVT; } if(events SBP_RF_TX_TIMEOUT_EVT) { tx_running FALSE; RF_Shut(); tx_rx_packet.len 0; tmos_clear_event(taskID, SBP_RF_TX_SEND_EVT | SBP_RF_TX_RX_DATA_EVT); PRINT(TX timeout, no ACK in 3s\n); return events ~(SBP_RF_TX_TIMEOUT_EVT | SBP_RF_TX_SEND_EVT | SBP_RF_TX_RX_DATA_EVT); } if(events SBP_RF_TX_RX_DATA_EVT) { uint8_t i; if(tx_rx_packet.len) { PRINT(tx recv ACK, rssi: %d\n, tx_rx_packet.rssi); PRINT(len:%d-, tx_rx_packet.len); for(i 0; i tx_rx_packet.len; i) { PRINT(%x , tx_rx_packet.data[i]); } PRINT(\n); tx_rx_packet.len 0; } tx_running FALSE; tmos_stop_task(taskID, SBP_RF_TX_TIMEOUT_EVT); RF_Shut(); PRINT(TX success, ACK received\n); return events ^ SBP_RF_TX_RX_DATA_EVT; } if(events SBP_RF_TX_SEND_EVT) { uint8_t state; if(!tx_running) { return events ^ SBP_RF_TX_SEND_EVT; } RF_Shut(); tx_end_flag FALSE; state RF_Tx(TX_DATA, sizeof(TX_DATA), 0xFF, 0xFF); if(state ! SUCCESS) { PRINT(TX start failed.state %x\n, state); tmos_start_task(taskID, SBP_RF_TX_SEND_EVT, MS1_TO_SYSTEM_TIME(1)); } return events ^ SBP_RF_TX_SEND_EVT; } #else /* Close RX first if close and restart events arrive together. */ if(events SBP_RF_RX_CLOSE_EVT) { uint8_t i; rx_window_open FALSE; tmos_stop_task(taskID, SBP_RF_RX_CLOSE_EVT); RF_Shut(); if(rx_packet.len) { PRINT(rx recv, rssi: %d\n, rx_packet.rssi); PRINT(len:%d-, rx_packet.len); for(i 0; i rx_packet.len; i) { PRINT(%x , rx_packet.data[i]); } PRINT(\n); rx_packet.len 0; } if(rx_ack_status 1) { PRINT(ACK sent, RX closed early\n); } else if(rx_ack_status 2) { PRINT(ACK failed, RX closed early\n); } return events ^ SBP_RF_RX_CLOSE_EVT; } if(events SBP_RF_RX_OPEN_EVT) { uint8_t state; rx_window_open TRUE; rx_first_packet FALSE; rx_ack_status 0; rx_packet.len 0; rx_end_flag FALSE; RF_Shut(); state RF_Rx(ACK_DATA, sizeof(ACK_DATA), 0xFF, 0xFF); PRINT(RX window open.state %x\n, state); tmos_start_task(taskID, SBP_RF_RX_CLOSE_EVT, RF_RX_WINDOW); tmos_start_task(taskID, SBP_RF_RX_OPEN_EVT, RF_RX_PERIOD); return events ^ SBP_RF_RX_OPEN_EVT; } #endif return 0; } /********************************************************************* * fn RF_Init * * brief RF 初始化 * * return none */ void RF_Init(void) { uint8_t state; rfConfig_t rf_Config; tmos_memset(rf_Config, 0, sizeof(rfConfig_t)); taskID TMOS_ProcessEventRegister(RF_ProcessEvent); rf_Config.accessAddress 0x71764129; // 禁止使用0x55555555以及0xAAAAAAAA ( 建议不超过24次位反转且不超过连续的6个0或1 ) rf_Config.CRCInit 0x555555; rf_Config.Channel 39; rf_Config.Frequency 2480000; #if(RF_AUTO_MODE_EXAM) rf_Config.LLEMode LLE_MODE_AUTO; #else rf_Config.LLEMode LLE_MODE_BASIC | LLE_MODE_EX_CHANNEL; // 使能 LLE_MODE_EX_CHANNEL 表示 选择 rf_Config.Frequency 作为通信频点 #endif rf_Config.rfStatusCB RF_2G4StatusCallBack; rf_Config.RxMaxlen 251; state RF_Config(rf_Config); PRINT(rf 2.4g init: %x\n, state); #if(RF_DEVICE_ROLE RF_DEVICE_ROLE_TX) tx_rx_packet.len 0; tx_running FALSE; HAL_KeyIrqInit(); #else rx_window_open FALSE; tmos_set_event(taskID, SBP_RF_RX_OPEN_EVT); #endif } /******************************** endfile main ******************************/

相关新闻

MIPI-DSI信号测量实战:从示波器基础到眼图分析

MIPI-DSI信号测量实战:从示波器基础到眼图分析

1. 从“看见”到“看懂”:示波器在MIPI-DSI信号测量中的角色定位当一块手机屏幕点亮,或者一块智能手表的界面流畅滑动时,其背后是高速串行总线在无声地传输着海量的像素数据。MIPI-DSI(Mobile Industry Processor Interface Displ…

2026/10/11 7:56:23 阅读更多 →
DX进化驱动器玩具:Evolto形态进化全解析与操作指南

DX进化驱动器玩具:Evolto形态进化全解析与操作指南

1. 先搞清楚这套玩具到底能玩什么如果你对《假面骑士》系列里的Evolto(E总)有印象,这套DX进化驱动器玩具最大的价值就是用一个套装还原了他在TV版中的所有形态变化。不需要单独购买多个驱动器或道具,开箱就能体验从眼镜蛇形态到黑…

2026/10/10 23:34:48 阅读更多 →
Unity3D实战:休闲战争策略游戏的金币系统与评分设计

Unity3D实战:休闲战争策略游戏的金币系统与评分设计

1. 项目概述与核心思路最近几年,休闲战争策略游戏在移动端和PC平台都挺火的。这类游戏通常节奏快、上手简单,但又保留了策略游戏的深度和成长感,比如经典的《皇室战争》就是典型代表。很多独立开发者或者小团队都想尝试这个方向,而…

2026/10/9 18:30:32 阅读更多 →

最新新闻

2026软件测试面试指南:从Linux到AI测试的全栈质量保障

2026软件测试面试指南:从Linux到AI测试的全栈质量保障

1. 2026年软件测试面试到底在面什么做了这么多年软件测试,也面试过不少候选人,我越来越觉得现在的面试早就不是背几套题就能过关的时代了。前两天跟一个刚跳槽去大厂的兄弟聊天,他说现在的软件测试面试题已经卷到“既要懂八股、又要能落地、还…

2026/10/11 8:50:40 阅读更多 →
GET请求知识详解

GET请求知识详解

一、GET 请求是什么GET 是 HTTP 协议里最基础的一种请求方法。一句话理解:从服务器「获取 / 查询」数据,不修改服务器上的数据。 就像你在浏览器地址栏输入网址敲回车,本质就是发送 GET 请求,向服务器拿网页内容。核心特点&#x…

2026/10/11 8:50:40 阅读更多 →
AgentScope Java 2.x 系列【45】 2.0.4 版本更新:支持 Responses API、个人微信......

AgentScope Java 2.x 系列【45】 2.0.4 版本更新:支持 Responses API、个人微信......

文章目录1. 更新速览1.1 ✨ 新增1.1.1 核心 / 模型1.1.2 Harness / 工具 / 存储1.2.3 Service / Channel1.2 🔄 变更1.3 🛠️ 修复1.3.1 核心 / 状态 / 并发1.3.2 模型提供商1.3.3 Harness / 沙箱 / 集成1.4 📖 文档更新2. 重要更新2.1 OpenA…

2026/10/11 8:50:40 阅读更多 →
96% 氧化铝陶瓷怎么切?脆性材料的水刀工艺与参数边界

96% 氧化铝陶瓷怎么切?脆性材料的水刀工艺与参数边界

结论先行:氧化铝陶瓷(尤其 96% 含量)硬度高、脆性大、还导电性差。硬、脆、不导电三条凑一起,传统切割方式基本都别扭:刀具磨不动,激光有热应力、容易崩裂,线切割又不导电切不了。陶瓷为什么难切…

2026/10/11 8:50:40 阅读更多 →
风光出力联合建模:Matlab中Weibull与Beta分布及Copula耦合实现

风光出力联合建模:Matlab中Weibull与Beta分布及Copula耦合实现

风电的出力随机性有多难搞,做过新能源并网仿真的人都懂:风速忽大忽小,光照一阵一阵,你要是拿个正态分布去套,风功率曲线尾巴根本对不上。圈里早就形成了一套经验——风速用两参数Weibull分布去拟合,光照辐照…

2026/10/11 8:50:40 阅读更多 →
车载空调建模与控制算法实战:从数学推导到图纸落地

车载空调建模与控制算法实战:从数学推导到图纸落地

兄弟们,聊个接地气的话题。前阵子我把一个车载空调控制器的算法模型从零到一完整落地了一版,从最初的数学推导、仿真验证,到最后的控制算法写进控制器、再到结构图纸冻结,整个流程走完,感触挺深的。这事看起来是个传统…

2026/10/11 8:49:40 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →