使用system调用BlueNRG-X_Flasher_Launcher.exe始终返回0如何解决
临时解决方案(基于现有
system调用实现,无需重构调用逻辑) 方案1:输出重定向+关键字匹配
- 调用
BlueNRG-X_Flasher_Launcher.exe时,在命令末尾追加输出重定向规则,将标准输出、标准错误全部写入临时日志文件,示例命令格式:BlueNRG-X_Flasher_Launcher.exe [你的原有烧录参数] > bluenrg_burn_log.txt 2>&1 system调用返回后,读取临时日志文件内容,匹配预定义的关键字判断结果:- 先匹配失败特征串:手动模拟断连、参数错误等失败场景,收集工具输出的固定错误标识(如
No device detected、Programming failed、Connection error等),命中任意一个即可判定为烧录失败 - 再匹配成功特征串:比如
Programming completed、Verify success等官方输出的成功标识,命中才算最终成功
- 先匹配失败特征串:手动模拟断连、参数错误等失败场景,收集工具输出的固定错误标识(如
- 判定完成后删除临时日志文件即可,不残留冗余文件
方案2:批处理脚本中转,统一返回码格式
如果不想改动C端原有读取返回值的逻辑,可以写一层批处理脚本做中转,C直接调用批处理脚本即可拿到正确返回值:
- 新建
bluenrg_flash_wrapper.bat,写入以下逻辑:
@echo off setlocal enabledelayedexpansion :: 接收所有传入参数调用烧录工具,输出写入系统临时目录的日志文件 BlueNRG-X_Flasher_Launcher.exe %* > %temp%\bluenrg_burn_temp.log 2>&1 :: 匹配错误关键词,命中返回1 findstr /i /c:"No device" /c:"Program failed" /c:"Connection error" "%temp%\bluenrg_burn_temp.log" > nul if %errorlevel% equ 0 ( del "%temp%\bluenrg_burn_temp.log" exit /b 1 ) :: 匹配成功关键词,命中返回0 findstr /i /c:"Program completed" /c:"Verify success" "%temp%\bluenrg_burn_temp.log" > nul if %errorlevel% equ 0 ( del "%temp%\bluenrg_burn_temp.log" exit /b 0 ) :: 未匹配到任何特征的异常场景返回2 del "%temp%\bluenrg_burn_temp.log" exit /b 2
- C++端将原有
system调用的命令从直接调用exe改为调用bat,参数保持不变,即可像ST-LINK_CLI一样直接通过system的返回值判断烧录结果。
注意事项
- 特征串需要你根据自己使用的v4.1.0版本工具实际输出做调整,手动遍历所有可能的失败场景收集完整关键词,避免误判
- 后续切换到
CreateProcess方案时,可以通过匿名管道直接捕获工具输出,不需要写入临时文件,执行效率更高
内容的提问来源于stack exchange,提问作者TheThirdFriend
相关产品推荐
相关产品推荐

