STM32 HAL库串口通信实战:中断与DMA高效收发数据
1. 项目概述从零到一打通串口通信搞嵌入式开发尤其是玩STM32的串口通信绝对是第一个要啃下来的硬骨头。它就像单片机的“嘴巴”和“耳朵”是调试信息输出、与上位机对话、连接各种模块比如GPS、蓝牙、Wi-Fi最基础、最常用的通道。我刚开始接触STM32那会儿用标准库调串口光是初始化那一堆寄存器就够头疼的更别提中断处理了。后来ST推出了HAL库一开始大家还嫌它“笨重”、“效率低”但用久了才发现它的统一性和跨芯片兼容性是真香尤其是在项目移植和快速原型开发阶段。这个项目标题“stm32HAL库实现串口收发数据”听起来简单但里面门道不少。它要解决的核心问题就是如何利用ST官方提供的硬件抽象层库在STM32芯片上稳定、高效地配置和使用串口实现数据的接收和发送。这不仅仅是调通一个功能更是理解HAL库工作流、掌握中断/DMA等高级用法、建立稳健通信逻辑的起点。无论你是刚拿到一块STM32开发板的学生还是需要为一个新产品添加调试接口的工程师这套流程都是必须掌握的。接下来我就结合自己踩过的坑和总结的经验带你从CubeMX配置到代码编写再到调试技巧完整地走一遍。2. 核心思路与方案选型为什么是HAL库中断/DMA在动手之前我们得先想清楚怎么干。串口收发数据听起来就两个动作发和收。但具体怎么实现却有好几种方案选择哪种直接决定了代码的复杂度、效率和实时性。2.1 方案对比与选型理由最基础的玩法是轮询。就是主程序在一个循环里不停地去查询串口接收寄存器有没有新数据有了就读出来要发送时就查询发送寄存器是否空闲空闲了就写入数据。这种方法代码简单直白但缺点太明显CPU被大量占用在“查询”这个无聊的动作上干不了别的正事效率极低。除非你的系统超级简单否则基本不推荐。所以我们得用更聪明的方式中断。当串口收到一个数据或者发送完一个数据时硬件会产生一个中断信号CPU会暂时放下手头的工作跳转到我们预先写好的中断服务函数里去处理这个接收或发送事件。处理完再回去继续干原来的活。这样CPU就解放了只在有数据需要处理时才出面效率大大提升。对于大多数中低速、数据量不大的通信场景比如调试信息打印接收一些配置命令中断方式是完全够用且推荐的。那如果数据量很大呢比如要连续收发几百上千字节的数据每个字节都触发一次中断CPU频繁跳转开销又变大了。这时候就该DMA出场了。DMA可以看作一个“数据搬运工”我们只要告诉它从内存这个地址比如一个数组搬运多少数据到串口的发送寄存器或者从串口的接收寄存器搬运多少数据到内存的某个地址。设定好之后DMA就会在后台默默工作完全不需要CPU干预。数据搬完了DMA再通知一下CPU。这在处理批量数据、高速流式数据时比如图像传输、音频流能极大减轻CPU负担实现高效传输。对于本项目我推荐“中断接收 中断/DMA发送”的混合方案作为入门和主流实践。接收用中断可以保证数据到来的实时性不错过任何一个字节发送根据数据量灵活选择短消息用中断长数据用DMA。这个方案在复杂度和性能之间取得了很好的平衡。而HAL库为我们封装好了所有这些模式的接口让切换和使用变得非常方便这就是我们选择HAL库的核心原因——它提供了统一、高级的API让我们更关注业务逻辑而非底层寄存器。2.2 HAL库的优劣与我们的策略当然HAL库也不是完美的。它的“笨重”体现在为了通用性代码执行路径可能较长在极端追求效率的场景下不如标准库或LL库。但对于绝大多数应用这点开销完全可以接受。我们的策略是利用CubeMX进行图形化初始化生成基础代码框架然后重点理解和修改用户代码区的回调函数与应用程序逻辑。这样既能享受快速开发的便利又能保持对关键流程的控制。3. 环境准备与CubeMX工程配置理论清楚了咱们开始动手。第一步是把硬件和软件环境搭起来并用STM32CubeMX这个神器生成工程骨架。3.1 软硬件清单硬件STM32开发板一块以常见的STM32F103C8T6核心板为例其他系列大同小异。USB转串口模块一个常用CH340、CP2102、FT232等芯片。务必确认其电压与开发板匹配通常是3.3V。杜邦线若干。电脑一台。软件STM32CubeMXST官方的图形化配置工具。IDEKeil MDK-ARM、IAR Embedded Workbench 或 STM32CubeIDE免费任选其一。本文示例基于Keil。串口调试助手PC端用于收发数据的工具如SSCOM、XCOM、Putty等。3.2 CubeMX关键配置步骤新建工程选择芯片打开CubeMX点击“New Project”输入你的芯片型号如STM32F103C8然后选择具体型号。配置系统核心SYS-Debug根据你的调试器选择用ST-Link就选“Serial Wire”。这关系到SWD接口能否正常使用。RCC-High Speed Clock (HSE)选择“Crystal/Ceramic Resonator”。如果你的板子有外部高速晶振通常8MHz这一步必须配置它是系统主时钟的来源。配置串口假设我们使用USART1。在左侧引脚图找到PA9TX和PA10RX点击将其功能设置为“USART1_TX”和“USART1_RX”。在左侧分类视图中找到USART1。Mode选择“Asynchronous”异步通信这是最常用的模式。Basic ParametersBaud Rate设置波特率常用115200。发送和接收设备波特率必须严格一致否则全是乱码。Word Length数据位默认8位。Parity校验位默认None。Stop Bits停止位默认1位。NVIC Settings这是中断配置的关键勾选“USART1 global interrupt”使能全局中断。优先级可以先用默认值。配置时钟树这是CubeMX的难点但也是保证系统稳定运行的基础。找到时钟树配置页面通常HAL库会提供一个“时钟框图”。我们的目标是将系统时钟SYSCLK配置到芯片允许的最高频率对于F103是72MHz。一个常见路径是HSE8MHz - PLL倍频x9 - 得到72MHz - 作为SYSCLK。CubeMX可以点击“HCLK”输入框直接输入72然后回车它会尝试自动计算并配置你检查一下路径是否正确即可。配置正确后时钟树图上会显示关键节点的频率。生成工程代码转到“Project Manager”标签页。Project-Toolchain/IDE选择你的IDE如MDK-ARM。为工程起名选择存储路径。Code Generator标签下强烈建议勾选“Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral”这样每个外设的代码会单独成对文件结构清晰。再勾选“Copy all used libraries into the project folder”避免路径问题。点击“GENERATE CODE”生成工程。注意第一次使用CubeMX生成针对某个芯片的工程时它会提示下载对应的芯片支持包DFP按照提示在线安装即可。4. 代码实现中断接收与发送详解工程生成后用IDE打开。CubeMX生成的代码结构清晰main.c中包含了main()函数和外设初始化代码在/* USER CODE BEGIN xxx */和/* USER CODE END xxx */注释对之外。我们所有的自定义代码都必须写在USER CODE注释对之间这样下次用CubeMX重新生成代码时我们的修改不会被覆盖。4.1 串口初始化与启动CubeMX已经在main()函数中的MX_USART1_UART_Init()函数里帮我们完成了串口硬件参数的初始化波特率、数据位等。我们还需要在初始化后手动启动串口接收中断。在main()函数中找到初始化外设之后、主循环之前的位置添加以下代码/* USER CODE BEGIN 2 */ // 启动串口空闲中断推荐方式用于接收不定长数据 // 或者启动串口接收中断用于接收定长或单字节 // 这里先演示单字节中断接收 HAL_UART_Receive_IT(huart1, rx_buffer, 1); /* USER CODE END 2 */这行代码调用了HAL库的HAL_UART_Receive_IT函数。它的作用是使能串口接收中断并设置一个接收缓冲区rx_buffer你需要先定义一个比如uint8_t rx_buffer;和期望接收的数据长度这里是1。当串口收到1个字节后就会触发接收完成中断。4.2 重写中断回调函数HAL库采用了回调机制。当中断发生时HAL库的中断服务函数名字固定如USART1_IRQHandler会先处理底层硬件操作然后调用一个对应的回调函数。我们需要重写这个回调函数加入自己的数据处理逻辑。在main.c文件末尾的/* USER CODE BEGIN 4 */区域或者更好的做法是在单独的user_uart.c文件中重写接收完成回调函数/* USER CODE BEGIN 4 */ // 定义接收缓冲区 uint8_t rx_buffer; uint8_t tx_buffer[] I received: \n; uint8_t new_data_flag 0; // 新数据接收标志 // 重写UART接收完成回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { // 判断是哪个串口触发的回调 if(huart-Instance USART1) { new_data_flag 1; // 设置标志位通知主循环有新数据 // 在这里可以立即处理数据例如回显 // HAL_UART_Transmit_IT(huart1, rx_buffer, 1); // 重新启动接收中断等待下一个字节 HAL_UART_Receive_IT(huart1, rx_buffer, 1); } } /* USER CODE END 4 */关键点解析HAL_UART_RxCpltCallback是弱定义函数我们在这里重写它编译器就会链接我们的版本。回调函数中首先要判断huart-Instance是哪个串口因为所有串口中断最终都会调用这个函数。这对于多串口项目尤为重要。我在这里采用了一种“标志位”机制。在中断服务函数里只做最少、最快的操作设置标志位、重新启动接收。而把可能耗时的数据处理比如解析命令、存储到队列放到主循环中根据标志位去执行。这是保持中断响应迅速、避免在中断中处理复杂任务的良好实践。HAL_UART_Receive_IT(...)必须重新调用因为每次中断接收完成指定长度数据后HAL库会关闭本次接收中断。重新调用此函数是为了让串口继续监听下一个数据。忘记这一步是新手最常见的错误会导致只收到第一个字节。4.3 主循环中的数据发送与处理主循环中我们轮询检查接收标志位并进行处理。/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ // 检查是否有新数据收到 if(new_data_flag 1) { new_data_flag 0; // 清除标志 // 示例1简单回显中断发送 HAL_UART_Transmit_IT(huart1, rx_buffer, 1); // 示例2发送一段字符串中断发送 // HAL_UART_Transmit_IT(huart1, tx_buffer, sizeof(tx_buffer)-1); // 示例3复杂处理例如将收到的字符存入队列或缓冲区 // user_buffer[user_index] rx_buffer; // if(rx_buffer \n || user_index BUF_SIZE) { // 遇到换行或缓冲区满 // process_user_command(user_buffer, user_index); // user_index 0; // } } // 这里可以执行其他任务如LED闪烁、传感器读取等 HAL_Delay(10); // 简单延时实际项目中建议使用定时器 } /* USER CODE END 3 */这里演示了中断发送HAL_UART_Transmit_IT。它的工作方式与接收中断类似指定发送缓冲区和长度函数启动发送后立即返回硬件在后台通过中断方式将数据发送完毕发送完成后会触发HAL_UART_TxCpltCallback回调函数。这样主循环在发送期间就不会被阻塞。5. 进阶技巧DMA传输与不定长数据接收基础的收发跑通后我们来解决两个更实际的问题大量数据发送如何不卡住CPU如何接收一段不定长度的数据比如一条以换行符结尾的指令5.1 使用DMA发送数据DMA配置需要在CubeMX中完成。回到CubeMX工程在USART1配置中找到DMA Settings标签页。点击 “Add” 选择 “USART1_TX”。方向是 “Memory To Peripheral”。模式通常选择 “Normal”发送一次如果选择“Circular”则是循环模式会不断重复发送慎用。优先级根据系统需求设置。 重新生成代码。发送数据时使用HAL_UART_Transmit_DMA函数uint8_t dma_tx_data[] This is a long message sent by DMA.\n; HAL_UART_Transmit_DMA(huart1, dma_tx_data, sizeof(dma_tx_data)-1);调用后DMA会自动将dma_tx_data中的数据搬运到串口发送寄存器CPU可以立即去执行其他任务。发送完成后会触发HAL_UART_TxCpltCallback回调与中断发送是同一个。特别注意在DMA传输期间不能修改或释放发送缓冲区dma_tx_data的内存否则发送的数据将是错误的。5.2 实现不定长数据接收空闲中断IDLE这是工程中的高频需求。HAL库为我们提供了“串口空闲中断”这个强大工具。当串口总线上一段时间没有收到新数据时就会产生空闲中断。我们可以利用“接收中断空闲中断”的组合拳用接收中断或DMA持续接收数据用空闲中断来判断一帧数据是否结束。CubeMX配置USART1配置中在“NVIC Settings”里使能全局中断即可空闲中断是硬件功能无需额外NVIC配置但需要在代码中使能。代码实现 我们需要在串口初始化后手动开启空闲中断并使用DMA来接收数据因为不知道长度用DMA更省心。/* USER CODE BEGIN 2 */ // 定义接收缓冲区 #define RX_DMA_BUFFER_SIZE 256 uint8_t rx_dma_buffer[RX_DMA_BUFFER_SIZE]; volatile uint16_t rx_len 0; // 实际接收到的数据长度 volatile uint8_t rx_complete_flag 0; // 帧接收完成标志 // 开启串口DMA接收 HAL_UART_Receive_DMA(huart1, rx_dma_buffer, RX_DMA_BUFFER_SIZE); // 开启串口空闲中断 __HAL_UART_ENABLE_IT(huart1, UART_IT_IDLE); /* USER CODE END 2 */重写空闲中断处理HAL库没有直接提供空闲中断的回调函数我们需要在串口全局中断服务函数中手动判断和处理。 在stm32f1xx_it.c文件中找到USART1_IRQHandler函数void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ // 判断是否是空闲中断 if((__HAL_UART_GET_FLAG(huart1, UART_FLAG_IDLE) ! RESET)) { // 清除空闲中断标志重要 __HAL_UART_CLEAR_IDLEFLAG(huart1); // 停止本次DMA传输为了获取接收到的数据长度 HAL_UART_DMAStop(huart1); // 计算本次接收到的数据长度 // DMA_BUFFER_SIZE 是DMA设定的接收长度 // __HAL_DMA_GET_COUNTER 获取DMA通道中剩余未传输的数据量 rx_len RX_DMA_BUFFER_SIZE - __HAL_DMA_GET_COUNTER(huart1.hdmarx); // 设置接收完成标志 if(rx_len 0) { rx_complete_flag 1; } // 重新启动DMA接收准备下一帧数据 HAL_UART_Receive_DMA(huart1, rx_dma_buffer, RX_DMA_BUFFER_SIZE); } /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler(huart1); /* USER CODE BEGIN USART1_IRQn 1 */ /* USER CODE END USART1_IRQn 1 */ }这样当一帧数据接收完毕总线空闲rx_complete_flag会被置1rx_len记录了这帧数据的实际长度。在主循环中检查这个标志然后处理rx_dma_buffer中前rx_len个字节的数据即可。处理完后记得清除标志。6. 调试技巧与常见问题排查代码写完了烧录进去没反应或者收到的是乱码别急调试是嵌入式开发的必修课。6.1 基础检查清单硬件连接TX接RXRX接TXGND接GND。这是最基础也最容易出错的地方务必反复确认。波特率等参数确保单片机程序设置的波特率、数据位、停止位、校验位与PC端串口调试助手完全一致。115200是最常用的但一定要核对。电源与电平确保USB转串口模块与STM32开发板共地且TX/RX引脚电平匹配通常是3.3V。有些老式PL2303模块是5V电平直接接3.3V的STM32可能无法通信甚至损坏IO口。驱动安装PC端需要正确安装USB转串口芯片的驱动CH340、CP2102等在设备管理器中能看到对应的COM口。6.2 软件调试与逻辑分析利用LED和调试口在关键代码位置如进入中断回调、收到特定数据控制一个LED翻转或通过另一个串口打印信息这是最直接的“printf调试法”。仿真器调试如果使用ST-Link等仿真器可以在IDE中设置断点单步执行查看变量值。特别适合检查初始化配置是否正确、中断是否触发。逻辑分析仪如果条件允许用逻辑分析仪抓取TX/RX引脚上的波形可以直接看到发送的字节、波特率是否准确。这是解决复杂通信问题的终极武器。6.3 常见问题速查表现象可能原因排查思路完全无任何数据1. 硬件连接错误TX/RX反接、虚焊2. 串口未初始化或使能3. PC端串口号选错或驱动问题4. 波特率相差巨大1. 用万用表通断档检查连线2. 检查MX_USARTx_UART_Init()是否被调用3. 检查设备管理器重启调试助手4. 尝试9600、115200等常见波特率收到乱码1.波特率不匹配最常见2. 数据位、停止位、校验位不匹配3. 时钟配置错误如HSE未使能系统时钟不对1.双端严格核对波特率2. 双端严格核对通信格式3. 检查CubeMX中时钟树配置特别是系统时钟频率只能收到第一个字节1. 接收中断未重新启动忘记在回调中调用HAL_UART_Receive_IT2. 中断优先级被意外关闭1.确保在接收完成回调中重新启动接收2. 检查NVIC配置避免在高优先级中断中卡死发送数据丢失最后几个字节1. 使用HAL_UART_Transmit阻塞发送后立即复位或关闭串口2. DMA发送未完成就修改了缓冲区1. 等待发送完成检查函数返回值或使用发送完成回调2. 在DMA发送完成回调中再操作缓冲区或进行下一步不定长接收不稳定1. 空闲中断标志未清除2. DMA重新启动的时机不对导致数据覆盖或丢失3. 缓冲区溢出1.务必调用__HAL_UART_CLEAR_IDLEFLAG2. 在空闲中断中先停DMA、计算长度、处理标志再重启DMA3. 确保接收缓冲区足够大并处理帧超长的情况6.4 关于重定向printf为了方便调试我们经常想用printf函数直接输出到串口。这需要重写fputc或_write函数。这里提供一个针对ARM CompilerKeil的简单方法 在main.c中添加以下代码#ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif PUTCHAR_PROTOTYPE { HAL_UART_Transmit(huart1, (uint8_t *)ch, 1, 1000); // 使用阻塞发送超时1000ms return ch; }然后在CubeMX中勾选“Use MicroLIB”在Project Manager - Target - Code Generation中这样就能在代码中直接使用printf(“Hello: %d\n”, value);了。注意频繁使用printf且使用阻塞发送会影响程序实时性在正式产品中需谨慎使用或使用更高效的方式。7. 项目总结与扩展思考走完这一整套流程你应该已经能够驾驭STM32的串口通信了。从CubeMX的图形化配置到中断回调的编写再到DMA和空闲中断处理不定长数据最后是各种调试手段。HAL库虽然抽象层次高但一旦掌握了它的套路初始化 - 启动 - 回调函数处理开发效率会提升很多。我个人在实际项目中通常会基于今天讲的内容封装一个更健壮的串口驱动模块。这个模块会包含环形缓冲区用于缓存接收到的原始数据解决中断处理过快而主循环处理慢的速度匹配问题。命令解析器从缓冲区中提取出完整的、以特定字符如换行符\n结尾的命令帧。协议处理如果是自定义的通信协议如简单的帧头长度数据校验格式在这里进行解包和校验。发送队列将要发送的数据放入队列由后台任务或DMA发送完成回调依次发送避免发送冲突。最后再分享一个小心得串口通信的稳定性一半靠代码一半靠硬件和物理层。如果项目中对通信可靠性要求高除了软件上加入校验、超时重发等机制硬件上也要考虑使用隔离芯片、添加TVS管等保护措施特别是在长距离、工业环境等场合。

相关新闻

架构实战第5篇:告别繁琐的数据库查重——字段唯一性校验的“懒人”封装方案

架构实战第5篇:告别繁琐的数据库查重——字段唯一性校验的“懒人”封装方案

摘要:唯一性校验是几乎所有业务系统都绕不开的需求——还在Service层写满if (exists) throw?不仅代码臃肿,更新逻辑还容易写错。本文结合《鹿鲸项目管理工具》实战,教你用“一个注解”彻底消灭查重代码,让业务逻辑回归…

2026/10/17 19:02:58 阅读更多 →
3个秘诀:用SillyTavern打造有灵魂的AI角色,告别机械对话

3个秘诀:用SillyTavern打造有灵魂的AI角色,告别机械对话

3个秘诀:用SillyTavern打造有灵魂的AI角色,告别机械对话 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern 你是不是也遇到过这样的困扰:精心设计的AI角色对…

2026/10/10 22:26:12 阅读更多 →
玄铁C910:RISC-V高性能处理器核心架构解析与应用实战

玄铁C910:RISC-V高性能处理器核心架构解析与应用实战

1. 玄铁C910:RISC-V世界的性能悍将 提到处理器,大家脑子里蹦出来的多半是英特尔、AMD,或者手机里的苹果A系列、高通骁龙。但今天想聊的,是一个在开源硬件领域掀起巨浪的名字——玄铁C910。它不是来自硅谷的巨头,而是诞…

2026/10/12 12:41:15 阅读更多 →

最新新闻

HTML字符转义与XSS攻击防御:规则、场景与最佳实践

HTML字符转义与XSS攻击防御:规则、场景与最佳实践

1. 先说清楚&#xff1a;字符转义到底在防什么先在开篇把话说透&#xff1a;HTML字符转义的核心使命&#xff0c;就是防止浏览器把用户输入的内容当成可执行的代码。如果你在某个文本框里输入了<script>alert(1)</script>&#xff0c;服务端原样输出到页面上&#…

2026/10/17 19:02:22 阅读更多 →
WebGL鼠标拖拽旋转的球面映射与四元数实现

WebGL鼠标拖拽旋转的球面映射与四元数实现

1. 为什么鼠标拖拽旋转在WebGL中不是“动动手指”那么简单很多人第一次尝试用鼠标控制WebGL场景中的立方体旋转时&#xff0c;会下意识地想&#xff1a;“不就是监听mousedown→mousemove→mouseup&#xff0c;然后把鼠标位移量直接加到旋转角度上吗&#xff1f;”我当年也是这…

2026/10/17 19:02:22 阅读更多 →
微服务三件套高可用部署实战:Docker Compose搭建Nacos、Seata、Sentinel集群

微服务三件套高可用部署实战:Docker Compose搭建Nacos、Seata、Sentinel集群

讲真的&#xff0c;微服务架构里事务和流控这两块&#xff0c;最容易让团队在“测试环境一切正常、一上线就出事”的怪圈里打转。Nacos、Seata、Sentinel这套组合&#xff0c;基本是Java微服务生态里绕不开的三件套。但网上教程大多是单机版演示&#xff0c;真到要部署成高可用…

2026/10/17 19:02:22 阅读更多 →
Spring Boot实现微信小程序登录全链路实战

Spring Boot实现微信小程序登录全链路实战

1. 项目概述&#xff1a;为什么“Spring Boot 微信小程序登录”是当前最稳的落地组合 最近两周&#xff0c;我帮三个不同背景的团队搭过小程序后端登录体系——有某高校实验室做的校园服务类轻应用&#xff0c;有某初创公司推的本地生活预约工具&#xff0c;还有一个是某传统…

2026/10/17 19:02:22 阅读更多 →
artcraft:用参数化工作流打通像素画与矢量插画的数字创作管线

artcraft:用参数化工作流打通像素画与矢量插画的数字创作管线

artcraft这个名字&#xff0c;第一次听到的人多半会以为是个艺术展览或者某个独立工作室的品牌。但如果我说&#xff0c;它是将“像素画、矢量插画、甚至手工雕刻”揉进同一条数字创作流水线时&#xff0c;你应该能感受到&#xff0c;这是一个典型的用技术思维反哺艺术表达的个…

2026/10/17 19:02:22 阅读更多 →
原生Canvas 2D实现情人节烟花代码:单文件零依赖,可定制情侣生日礼物

原生Canvas 2D实现情人节烟花代码:单文件零依赖,可定制情侣生日礼物

1. 从一行标题拆解出的真实需求第一次看到“烟花代码&#xff0c;情人节&#xff0c;情侣生日礼物代码适用”这个标题&#xff0c;我脑子里冒出来的不是“浪漫”&#xff0c;而是一连串很实际的问题&#xff1a;谁在用&#xff1f;在什么设备上跑&#xff1f;对方看到的是网页、…

2026/10/17 19:01:21 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

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

周新闻

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

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

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

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

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

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

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

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

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →