STM32串口通信实战:基于HAL库与DMA的高效驱动设计与避坑指南
1. 项目概述为什么我们需要一个“便捷的串口库”在嵌入式开发尤其是基于STM32这类MCU的项目里串口UART通信几乎是工程师的“空气和水”。无论是打印调试信息、与上位机通信还是连接GPS、蓝牙模块等外设串口都是最基础、最常用的接口。然而如果你直接使用芯片原厂提供的标准库Standard Peripheral Library或HAL库Hardware Abstraction Layer去操作串口很快就会陷入一种重复且繁琐的境地每次都要手动配置GPIO、初始化USART、编写中断服务函数、小心翼翼地处理环形缓冲区、担心数据覆盖和解析的时序问题。更别提当项目需要同时管理多个串口或者结合DMA直接存储器访问来提升效率、降低CPU负载时代码的复杂度和出错概率会呈指数级上升。这就是“一个便捷的串口库”所要解决的核心痛点。它不是一个简单的函数封装而是一个经过实战检验的、高可靠性的中间件。其目标是将开发者从底层硬件的繁琐细节中解放出来提供一个统一、简洁、线程安全即使在裸机环境下模拟的API接口。你只需要关心“发送什么数据”和“收到数据后怎么处理”而无需再纠结于寄存器配置、中断标志位清除、DMA传输计数管理等底层问题。结合当前的热搜词无论是使用HAL库处理串口空闲中断加DMA接收不定长数据还是在标准库下实现DMA收发这个库都能提供一套标准化的解决方案极大提升开发效率和代码的可维护性。2. 核心设计思路抽象与封装的艺术一个优秀的串口库其设计必然遵循高内聚、低耦合的原则。它需要对下封装不同硬件平台如STM32F1的标准库、F4的HAL库甚至其他厂商的MCU和不同外设实例USART1, USART2, …的差异对上提供完全一致的调用接口。其核心设计通常围绕以下几个关键概念展开2.1 对象化与实例管理库的核心是一个uart_device结构体或类它封装了一个串口外设的所有运行时状态和信息。这通常包括硬件标识指向底层USART句柄如UART_HandleTypeDef *huart或寄存器基地址。收发缓冲区核心组件通常是环形缓冲区Ring Buffer用于缓存待发送和已接收的数据。这是实现非阻塞通信、解耦数据处理与硬件中断的关键。同步机制在RTOS环境下可能需要信号量、互斥锁来保证多任务访问的安全性在裸机环境下则通过临界区保护来管理缓冲区。回调函数指针用于注册用户自定义的数据处理函数。例如当接收到一帧完整数据通过空闲中断或特定帧尾判定后自动调用此回调将应用层逻辑与底层驱动彻底分离。通过这种对象化的设计管理多个串口就像管理多个文件句柄一样简单。每个串口设备都是独立的实例互不干扰。2.2 数据流与缓冲区设计数据流的设计决定了库的效率和易用性。发送和接收路径通常是异步的发送路径用户调用uart_send(device, data, length)。库首先将数据拷贝到发送环形缓冲区然后尝试启动一次DMA传输如果使能且空闲。如果DMA正在忙数据会安静地躺在缓冲区里等待当前传输完成后的中断里自动启动下一次传输。整个过程对用户是透明的实现了“放进去就不用管”的“消防水管”模式。接收路径这是难点和重点。以热搜中“hal库串口空闲中断加dma”为例这是目前接收不定长数据的黄金方案。库的初始化会配置为DMA循环模式接收并开启串口空闲中断。数据流如下数据源源不断通过DMA存放到接收环形缓冲区CPU不参与。当一帧数据发送完毕串口线路进入空闲状态触发空闲中断。在空闲中断服务函数中库计算出DMA当前写指针与起始位置的偏移量即本次接收到的数据长度。库将这部分数据标记为“已就绪”并可能通过设置标志位或发送消息通知上层应用。应用层在主循环或任务中调用uart_read(device, buffer, size)来读取已就绪的数据进行处理。 这种设计完美解决了不定长数据的接收问题且CPU占用率极低。2.3 中断与DMA的协同库需要精心编织中断服务程序ISR和DMA传输完成中断TC、半传输中断HT的协作网络。发送DMA传输完成中断在此中断中检查发送缓冲区是否还有剩余数据。如果有则立刻配置DMA进行下一轮传输如果没有则关闭DMA请求等待用户下一次发送。这实现了发送缓冲区的“流水线”作业。串口空闲中断如上所述是帧结束的“发令枪”。错误处理中断库必须妥善处理溢出错误ORE、噪声错误等进行必要的标志位清除和状态重置保证通信的健壮性。注意在HAL库中使用空闲中断时务必在中断回调函数中调用__HAL_UART_CLEAR_IDLEFLAG(huart)清除空闲标志位并重新计算DMA接收长度。这是一个常见的遗漏点会导致仅第一次空闲中断能正常触发。3. 库的核心API与使用流程一个便捷的串口库其API应该极其简洁直观。下面以一个典型的C语言接口为例3.1 API 接口概览/* 设备初始化 */ uart_device_t* uart_init(uart_id_t id, uint32_t baudrate, uint8_t *tx_buf, uint32_t tx_buf_size, uint8_t *rx_buf, uint32_t rx_buf_size); /* 数据发送非阻塞*/ int32_t uart_send(uart_device_t *dev, const uint8_t *data, uint32_t len); /* 数据接收非阻塞*/ int32_t uart_receive(uart_device_t *dev, uint8_t *buffer, uint32_t size, uint32_t timeout_ms); /* 注册接收完成回调 */ void uart_set_rx_complete_callback(uart_device_t *dev, uart_rx_callback_t callback); /* 获取接收缓冲区中可读数据量 */ uint32_t uart_get_rx_available(uart_device_t *dev); /* 获取发送缓冲区剩余空间 */ uint32_t uart_get_tx_remaining(uart_device_t *dev);3.2 使用流程详解假设我们在STM32F407VET6上使用USART1基于HAL库和CubeMX配置了“空闲中断DMA循环接收”。第一步硬件与底层驱动配置使用STM32CubeMX配置USART1为异步模式设置波特率、数据位、停止位、校验位。启用USART1的全局中断NVIC。在DMA设置中为USART1_RX添加一个DMA流如DMA2 Stream2模式设为“Circular”循环模式数据宽度Byte。为USART1_TX添加一个DMA流如DMA2 Stream7模式设为“Normal”正常模式。在代码生成后在usart.c中手动添加空闲中断使能在HAL_UART_MspInit函数末尾添加__HAL_UART_ENABLE_IT(huart1, UART_IT_IDLE);。实现USART1的IRQHandler并在其中调用库的uart_irq_handler(device)函数由库统一处理空闲中断等逻辑。第二步库的初始化和集成// 定义收发缓冲区 uint8_t uart1_tx_buffer[512]; uint8_t uart1_rx_buffer[1024]; // 接收缓冲区建议设大一些 // 在main函数初始化阶段 uart_device_t *uart1_dev; uart1_dev uart_init(UART1_DEVICE, 115200, uart1_tx_buffer, 512, uart1_rx_buffer, 1024); if (uart1_dev NULL) { // 初始化失败处理 } // 注册回调函数可选 uart_set_rx_complete_callback(uart1_dev, my_data_parser_callback); // 启动接收使能DMA循环接收和空闲中断 uart_start_receive(uart1_dev);第三步应用层数据收发// 发送数据如响应上位机指令 uint8_t response[] OK\r\n; uart_send(uart1_dev, response, sizeof(response) - 1); // 非阻塞立即返回 // 在主循环中处理接收数据轮询方式 void main_loop(void) { uint8_t temp_buf[128]; int32_t read_len; read_len uart_receive(uart1_dev, temp_buf, sizeof(temp_buf), 0); // 0表示非阻塞读取 if (read_len 0) { // 处理读到的 temp_buf 中的数据 process_received_data(temp_buf, read_len); } // 或者如果使用了回调函数数据处理会在回调中自动进行 // 主循环可以执行其他任务 }4. 关键实现细节与避坑指南4.1 环形缓冲区的无锁实现在裸机系统中为了保证效率环形缓冲区的读写操作通常设计为无锁的但前提是遵守“单生产者-单消费者”模型且中断与主循环的访问是原子的。对于STM3232位ARM Cortex-M读写一个uint32_t索引变量通常是原子的。但为了确保安全在中断服务程序ISR中修改写索引后主循环读取前可以考虑使用编译器屏障如__DSB()或临时关闭中断来读取一个“快照”。// 示例获取可读数据长度简化版 uint32_t get_rx_available(uart_device_t *dev) { uint32_t w dev-rx_buffer-write_index; // 可能在中断中被修改 uint32_t r dev-rx_buffer-read_index; if (w r) { return w - r; } else { return dev-rx_buffer-size - r w; } } // 更安全的做法是在调用此函数前后进入/退出临界区4.2 DMA指针计算与缓冲区边界处理这是“空闲中断DMA”模式的核心难点。DMA通常配置为循环模式其内置的计数器CNDTR会不断递减但我们需要的是自接收开始以来总共收到了多少字节。正确计算方法// 在空闲中断处理函数中 void uart_idle_irq_handler(uart_device_t *dev) { __HAL_UART_CLEAR_IDLEFLAG(dev-huart); // 清除标志 uint32_t dma_buffer_size dev-rx_dma_buffer_size; // DMA缓冲区总大小 uint32_t dma_current_pos dev-rx_dma_buffer_size - __HAL_DMA_GET_COUNTER(dev-hdma_rx); // 当前写位置 uint32_t received_len; if (dma_current_pos dev-last_dma_pos) { received_len dma_current_pos - dev-last_dma_pos; } else { // 发生了缓冲区回绕 received_len dma_buffer_size - dev-last_dma_pos dma_current_pos; } // 将 received_len 个字节的数据从DMA缓冲区的 dev-last_dma_pos 位置开始拷贝到软件环形缓冲区 copy_to_ring_buffer(dev-rx_buffer, dev-rx_dma_buffer[dev-last_dma_pos], received_len); // 更新上一次的DMA位置 dev-last_dma_pos dma_current_pos; // 通知应用层有数据就绪 set_data_ready_flag(dev); }避坑指南务必在每次空闲中断处理后更新last_dma_pos。DMA的CNDTR寄存器是只读的且表示的是剩余传输次数需要用总大小减去它才能得到当前写指针。计算回绕情况是必须的。4.3 发送阻塞与非阻塞的平衡uart_send函数设计为非阻塞的立即返回。但如果发送缓冲区已满怎么办常见的策略有丢弃新数据返回错误码UART_ERR_TX_BUSY。适用于实时性要求不高允许偶尔丢数据的场景。等待直到超时函数内部进行短时间轮询等待缓冲区有空间。这在一定程度上变成了“阻塞”但超时时间可以设得很短如1ms。覆盖旧数据在特定场景下如持续发送调试信息可以选择覆盖缓冲区中最老的未发送数据。这需要谨慎设计。我个人更倾向于策略1立即返回错误并将选择权交给上层应用。应用层可以根据业务逻辑决定是重试、丢弃还是等待。这保持了底层库的简洁和确定性。4.4 与RTOS的集成如果项目使用FreeRTOS、RT-Thread等操作系统库需要做相应适配以发挥RTOS的优势。信号量替代标志位用二值信号量或计数信号量替代简单的data_ready_flag。当空闲中断收到数据后释放give一个信号量。应用任务通过获取take信号量来等待数据实现了任务阻塞与高效调度。互斥锁保护缓冲区虽然中断和任务间的缓冲区操作可以设计为无锁但多个任务同时读写同一个串口设备时就需要用互斥锁Mutex来保护。动态内存分配可以提供使用RTOS内存管理函数如pvPortMalloc来动态创建设备对象和缓冲区的API选项增加灵活性。// RTOS版本的回调通知示例 void uart_rx_dma_idle_callback(uart_device_t *dev, uint32_t len) { BaseType_t xHigherPriorityTaskWoken pdFALSE; // 将数据从DMA缓冲区拷贝到消息队列或流缓冲区 xStreamBufferSendFromISR(dev-rx_stream_buffer, dev-rx_dma_buffer, len, xHigherPriorityTaskWoken); // 发送任务通知给处理任务 vTaskNotifyGiveFromISR(dev-processing_task_handle, xHigherPriorityTaskWoken); portYIELD_FROM_ISR(xHigherPriorityTaskWoken); }5. 针对不同库的适配与实战心得5.1 HAL库 vs 标准库热搜词中同时出现了HAL库和标准库这反映了开发者群体的不同偏好和项目历史遗留问题。HAL库适配HAL库抽象程度高函数接口统一但执行效率相对较低代码体积大。适配时主要利用HAL_UART_*系列函数和回调机制如HAL_UART_TxCpltCallback。空闲中断需要手动使能和清除标志。HAL库的DMA控制API比较清晰但要注意其状态机管理避免在状态BUSY时重复启动传输。标准库适配标准库更接近寄存器效率高代码精简但可移植性稍差。适配时需要直接操作USART和DMA的寄存器。例如使能空闲中断是USART_ITConfig(USART1, USART_IT_IDLE, ENABLE)。计算接收数据长度需要直接读取DMA通道的CNDTR寄存器。标准库下的实现通常性能更优但对开发者要求也更高。实战心得在新项目或需要快速原型开发时我推荐使用HAL库结合CubeMX图形化配置能极大节省初始搭建时间。而对于资源紧张Flash/RAM小、对性能有极致要求的量产项目或者维护老代码时标准库仍是更优选择。我们的“便捷串口库”可以通过宏开关来兼容这两种底层驱动为不同项目提供统一的上层接口。5.2 处理高波特率与大数据量当波特率上升到1Mbps甚至更高或者需要连续传输大量数据如固件升级时一些细节变得至关重要缓冲区大小接收缓冲区必须足够大以容纳在应用层处理速度跟不上时堆积的数据。一个粗略的计算方法是缓冲区大小 (最大预期处理延迟秒数 * 波特率 / 10)。例如115200波特率下如果应用层可能忙100ms则需要至少0.1 * 115200 / 10 ≈ 1152字节的缓冲区。DMA优先级为串口收发DMA流设置合适的NVIC优先级。通常接收DMA的优先级应高于发送DMA以避免接收溢出。关闭编译器优化对于被DMA和CPU共享的缓冲区即DMA_Memory_0地址指向的数组建议在定义时使用__attribute__((section(“.dma_buffer”)))将其放到特定段或者使用volatile关键字防止编译器进行激进的优化导致数据不一致。心跳与超时机制对于通信协议除了依赖空闲中断还应实现软件超时机制。即记录最后一次收到字节的时间如果超过一定时限如100ms仍未收到新数据或空闲中断则认为一帧结束强制提交已接收的数据进行处理。这可以应对某些模块不发空闲帧或空闲中断因干扰未触发的情况。5.3 调试技巧与常见问题排查即使有了完善的库在实际调试中还是会遇到各种问题。下面是一个快速排查清单现象可能原因排查步骤完全收不到数据1. 线接反RX/TX2. 波特率不匹配3. 串口外设时钟未使能4. GPIO模式配置错误应为复用推挽输出/浮空输入1. 交换RX/TX线序测试。2. 使用示波器或逻辑分析仪测量波形计算实际波特率。3. 检查__HAL_RCC_USART1_CLK_ENABLE()是否调用。4. 核对CubeMX或代码中的GPIO配置。能收不能发或能发不能收1. 单方向GPIO配置错误2. DMA流配置错误方向3. 中断未使能1. 分别检查TX和RX引脚配置。2. 检查DMA的PeriphToMemory或MemoryToPeriph方向。3. 在调试器中查看NVIC设置确认USART和DMA中断已开启。数据错乱、丢字节1. 缓冲区溢出2. 中断嵌套/优先级冲突3. 主循环处理数据太慢1. 增大缓冲区并在代码中检查溢出标志。2. 调整串口中断和DMA中断的优先级确保接收路径中断不被长时间阻塞。3. 优化应用层数据处理逻辑或使用DMA双缓冲半传输中断进一步降低CPU干预频率。空闲中断不触发1. 空闲中断未使能2. 空闲标志未清除3. 总线始终有数据如噪声1. 确认代码中调用了__HAL_UART_ENABLE_IT(huart, UART_IT_IDLE)。2. 在空闲中断服务函数开头立即清除标志位。3. 检查硬件线路增加适当的上下拉电阻或滤波电容。DMA发送卡住只发一次1. DMA模式设为Normal而非Circular发送应为Normal但逻辑需衔接2. 发送完成中断中未检查并启动下一次传输3. DMA传输完成中断未清除标志1. 确认发送DMA为Normal模式并在库中实现发送缓冲区的链式管理。2. 在HAL_UART_TxCpltCallback中检查发送环形缓冲区若还有数据则调用HAL_UART_Transmit_DMA启动新传输。3. 检查相关中断标志位清除代码。一个高级调试技巧在串口初始化后先发送一段固定的字符串如“UART Ready\r\n”。如果上位机能收到证明发送通路基本正常。然后让MCU循环打印接收缓冲区的写指针和读指针位置。通过上位机发送数据观察指针变化可以非常直观地判断数据是否被正确接收并存入缓冲区以及应用层是否及时读取了数据。这是诊断数据流是否畅通的“听诊器”。6. 扩展思考从“库”到“框架”当一个“便捷的串口库”在项目中经受住考验后我们自然会思考如何将其价值最大化。它可以从一个孤立的通信驱动演变为一个轻量级的设备管理框架的核心。例如可以定义统一的device接口包含init,read,write,control,callback等函数指针。那么uart_device就是这个接口的一个实现。同样的框架可以轻松接入i2c_device,spi_device甚至虚拟的log_device输出到SEGGER RTT或shell_device命令行交互。更进一步可以在此框架上构建一个简单的消息总线或命令解析器。所有通过串口、网络等接收到的原始数据首先被对应的设备驱动接收然后打包成统一格式的消息如消息头设备ID数据长度数据载荷CRC投递到消息总线上。应用层的各个任务订阅自己感兴趣的消息类型进行处理。这样系统的模块化程度、可扩展性和可测试性都将得到质的提升。从“便捷的串口库”出发我们解决的远不止串口通信本身的问题更是构建了一种清晰、健壮、易于维护的嵌入式系统通信架构模式。它让开发者能够聚焦于业务逻辑的创新而非在底层驱动的泥潭中反复挣扎。这或许就是一个优秀工具库所能带来的最大价值。

相关新闻

MRIcroGL终极指南:5步掌握免费开源医学影像可视化神器

MRIcroGL终极指南:5步掌握免费开源医学影像可视化神器

MRIcroGL终极指南:5步掌握免费开源医学影像可视化神器 【免费下载链接】MRIcroGL v1.2 GLSL volume rendering. Able to view NIfTI, DICOM, MGH, MHD, NRRD, AFNI format images. 项目地址: https://gitcode.com/gh_mirrors/mr/MRIcroGL 在医学研究和临床诊…

2026/10/16 11:17:39 阅读更多 →
舆情危机爆发前17分钟,AI系统为何沉默?——基于千万级真实事件库的预警延迟根因分析与毫秒级修复方案

舆情危机爆发前17分钟,AI系统为何沉默?——基于千万级真实事件库的预警延迟根因分析与毫秒级修复方案

更多请点击: https://intelliparadigm.com 第一章:舆情危机爆发前17分钟,AI系统为何沉默?——基于千万级真实事件库的预警延迟根因分析与毫秒级修复方案 在2023年覆盖127家头部平台的千万级真实舆情事件回溯中,83.6%的…

2026/10/6 7:26:47 阅读更多 →
三星 Galaxy Watch9/Ultra2 正式发布,AI手表真正的门槛不只是算法,还有底层供电能力

三星 Galaxy Watch9/Ultra2 正式发布,AI手表真正的门槛不只是算法,还有底层供电能力

本文以三星新款Galaxy Watch系列发布为切入点,依托2026Q1 IDC、Counterpoint行业数据,分析端侧AI普及下智能手表轻薄机身、全天候监测与长续航的核心矛盾,梳理苹果、三星、华为、小米四大品牌产品策略,拆解供电四大行业痛点&#…

2026/10/8 1:02:48 阅读更多 →

最新新闻

设计与手作融合:从矢量设计到木质热转印装饰牌全流程

设计与手作融合:从矢量设计到木质热转印装饰牌全流程

第一次听说“artcraft”这个词时,我第一反应是:又是哪个展览或者文创品牌的宣传语吧?后来发现不是。它是一个我非常喜欢的创作状态——把“艺术设计”和“手工工艺”这两条看似平行的路,硬生生拧成一股绳的过程。做设计的人常常觉…

2026/10/17 4:25:08 阅读更多 →
ArtCraft:手工艺品从“手感”到“参数化数据库”的数字化管理

ArtCraft:手工艺品从“手感”到“参数化数据库”的数字化管理

年初给自己定了一个新项目,代号就叫 ArtCraft。说白了这个项目做的事情是:把“手工艺术品的构思、材料、工艺参数、制作过程”这些东西,从我的脑子和一堆乱糟糟的草稿纸里,搬进一个结构化、可复现、能随时调用的数字系统。去年有一…

2026/10/17 4:25:08 阅读更多 →
用Advanced IP Scanner快速定位Ubuntu主机IP

用Advanced IP Scanner快速定位Ubuntu主机IP

先讲一个我实际踩过的场景:某天新装了一台带桌面版的Ubuntu用于实验环境,装完顺手就把显示器拔了,放到角落只留一根网线。回头想起来要远程连进去跑脚本,打开终端准备SSH,卡在第一步——这台机器的IP到底是多少&#x…

2026/10/17 4:25:08 阅读更多 →
内存计算框架核心解析:原理、调优与实战避坑指南

内存计算框架核心解析:原理、调优与实战避坑指南

内存计算框架这个词,我在这个行业里听了不下十年,但每次跟朋友聊起来,发现还是有不少人把它理解成“把数据放到内存里算”这么简单。真到生产环境里,内存计算远远不是“放内存”三个字能概括的。前阵子我帮一个合作伙伴优化了一个…

2026/10/17 4:25:08 阅读更多 →
如何绘制不烂的架构图:diagram-design 规范全解析

如何绘制不烂的架构图:diagram-design 规范全解析

我接手某团队文档库的时候,diagrams 目录底下躺着十几版“最终架构图”,最新那几张里,方框大小全凭当初手抖的程度,箭头从右上角绕到左下角,红蓝绿混成一锅,路过的每个人都会顺手改两笔,结果谁也…

2026/10/17 4:25:08 阅读更多 →
HBase RowKey设计核心原则与实战模式:告别读写热点

HBase RowKey设计核心原则与实战模式:告别读写热点

关于HBase的RowKey设计,业内一直流传一句话:RowKey设计得好不好,直接决定了HBase集群是“跑车”还是“牛车”。接触HBase的开发者,前期可能更关注怎么建表、怎么写入、怎么用过滤器查询,但真正让一个业务系统在海量数据…

2026/10/17 4:24:08 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →