platformio烧写STC8H1K08单片机程序失败:Serial port error: read timeout

本文主要是介绍platformio烧写STC8H1K08单片机程序失败:Serial port error: read timeout,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题

在使用platformio进行STC8H1K08单片机开发,在烧录编译好的程序时失败了,烧录过程日志如下:

 *  正在执行任务: C:\Users\23043036\.platformio\penv\Scripts\platformio.exe run --target upload Processing STC8H1K08 (platform: intel_mcs51; board: STC8H1K08)
----------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/intel_mcs51/STC8H1K08.html
PLATFORM: Intel MCS-51 (8051) (2.2.0) > Generic STC8H1K08
HARDWARE: STC8H1K08 11MHz, 1.25KB RAM, 8KB Flash
PACKAGES:- tool-stcgal @ 1.110.0 (1.10)- tool-vnproch55x @ 1.0.220407- toolchain-sdcc @ 1.40400.0 (4.4.0)
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 0 compatible libraries
Scanning dependencies...
No dependencies
Building in release mode
Checking size .pio\build\STC8H1K08\firmware.hex
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
Flash: [========  ]  76.3% (used 6251 bytes from 8192 bytes)
Configuring upload protocol...
AVAILABLE: stcgal
CURRENT: upload_protocol = stcgal
Looking for upload port...
Auto-detected: COM3
Uploading .pio\build\STC8H1K08\firmware.hex
Cycling power: done
Waiting for MCU: done
Target model:Name: STC8H1K08Magic: F734Code flash: 8.0 KBEEPROM flash: 4.0 KB
Target frequency: 11.058 MHz
Target BSL version: 7.3.12U
Target wakeup frequency: 35.825 KHz
Target ref. voltage: 1190 mV
Target mfg. date: 2021-03-18
Target options:reset_pin_enabled=Falseclock_gain=highwatchdog_por_enabled=Falsewatchdog_stop_idle=Truewatchdog_prescale=256low_voltage_reset=Truelow_voltage_threshold=0eeprom_erase_enabled=Truebsl_pindetect_enabled=Falsepor_reset_delay=longrstout_por_state=highuart1_remap=Falseuart2_passthrough=Trueuart2_pin_mode=push-pullepwm_open_drain=Trueprogram_eeprom_split=8192
Loading flash: 6251 bytes (Intel HEX)
Trimming frequency: 11.062 MHz
Switching to 19200 baud: done
Serial port error: read timeout
*** [upload] Error 1
====================================== [FAILED] Took 24.20 seconds ======================================

解决过程

使用串口进行程序烧写,platformio使用的是stcgal工具,日志显示的就是stcgal和单片机的串口交互过程,为了查看更详细的过程日志,我们将Debug模式打开(在C:\Users\23043036\.platformio\platforms\intel_mcs51\builder\main.py中的UPLOADERFLAGS下添加"-D"参数),然后查看烧录过程日志:

 *  正在执行任务: C:\Users\23043036\.platformio\penv\Scripts\platformio.exe run --target upload Processing STC8H1K08 (platform: intel_mcs51; board: STC8H1K08)
----------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/intel_mcs51/STC8H1K08.html
PLATFORM: Intel MCS-51 (8051) (2.2.0) > Generic STC8H1K08
HARDWARE: STC8H1K08 11MHz, 1.25KB RAM, 8KB Flash
PACKAGES:- tool-stcgal @ 1.110.0 (1.10)- tool-vnproch55x @ 1.0.220407- toolchain-sdcc @ 1.40400.0 (4.4.0)
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 0 compatible libraries
Scanning dependencies...
No dependencies
Building in release mode
Checking size .pio\build\STC8H1K08\firmware.hex
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
Flash: [========  ]  77.3% (used 6330 bytes from 8192 bytes)
Configuring upload protocol...
AVAILABLE: stcgal
CURRENT: upload_protocol = stcgal
Looking for upload port...
Auto-detected: COM3
Uploading .pio\build\STC8H1K08\firmware.hex
Cycling power: done
<- Packet data: 46 B9 68 00 38 50 00 A8 F3 90 B4 00 02 FF FF BF BF FF 26 9C F7 20 73 55 00 F7 34 0C 8B F1 AF DC 0F 1F 20 FF 00 30 00 20 04 A6 21 03 18 32 FF 7B 2E 5A 8B A6 C4 F4 FF 17 CA 16
Waiting for MCU: done
Target model:Name: STC8H1K08Magic: F734Code flash: 8.0 KBEEPROM flash: 4.0 KB
-> Packet data: 46 B9 6A 00 20 00 0C 00 00 17 00 2E 00 45 00 5C 00 73 00 8A 00 A1 00 B8 00 CF 00 E6 00 FF 00 06 86 16
Target frequency: 11.072 MHz
Target BSL version: 7.3.12U
Target wakeup frequency: 35.825 KHz
Target ref. voltage: 1190 mV
Target mfg. date: 2021-03-18
Target options:reset_pin_enabled=Falseclock_gain=highwatchdog_por_enabled=Falsewatchdog_stop_idle=Truewatchdog_prescale=256low_voltage_reset=Truelow_voltage_threshold=0eeprom_erase_enabled=Truebsl_pindetect_enabled=Falsepor_reset_delay=longrstout_por_state=highuart1_remap=Falseuart2_passthrough=Trueuart2_pin_mode=push-pullepwm_open_drain=Trueprogram_eeprom_split=8192
Loading flash: 6330 bytes (Intel HEX)
<- Packet data: 46 B9 68 00 20 00 0C 17 72 19 31 1A CC 1C 64 1E 08 1F A9 21 08 22 A9 24 44 25 B2 27 4A 28 F7 07 7E 16
-> Packet data: 46 B9 6A 00 20 00 0C B3 00 B4 00 B5 00 B3 01 B4 01 B5 01 B3 02 B4 02 B5 02 B3 03 B4 03 B5 03 09 18 16
<- Packet data: 46 B9 68 00 20 00 0C 23 F0 24 08 24 17 23 F0 24 0E 24 1D 23 F3 24 0B 24 20 23 F9 24 0E 24 23 06 B2 16
Trimming frequency: 11.051 MHz
-> Packet data: 46 B9 6A 00 0E 01 00 00 FF CC 03 B3 80 03 7A 16
<- Packet data: 46 B9 68 00 07 01 00 70 16
-> Packet data: 46 B9 6A 00 0B 05 00 00 5A A5 01 79 16
Switching to 115200 baud: done
<- Packet data: 46 B9 68 00 07 05 00 74 16
-> Packet data: 46 B9 6A 00 0B 03 00 00 5A A5 01 77 16
Serial port error: read timeout
*** [upload] Error 1
====================================== [FAILED] Took 24.72 seconds ======================================*  终端进程“C:\Users\23043036\.platformio\penv\Scripts\platformio.exe 'run', '--target', 'upload'”已终止,退出代码: 1。 *  终端将被任务重用,按任意键关闭。

可以看到在stcgal与单片机交互过程中,发送了报文后单片机没有响应,最终超时了,通过阅读stcgal的代码以及添加打印,可以知道是在擦除芯片时交互失败的,通过报文分析,发现stcgal发送的报文是没有问题的,那为什么单片机没有响应呢?????
在stcgal的github上,issues中有类似的打印,但是没有具体的解决办法,网上相关的资料也很少,查找了好久,最终是在platformio的github上找到了解决办法。

解决办法

对于stc8,烧录时需要将stcgal_protocol改为auto,其他系列怎么样不知道,但是STC8如此修改后确实是可以的。
修改C:\Users\23043036\.platformio\platforms\intel_mcs51\builder\main.py文件,添加了一下内容:

if stcgal_protocol == 'stc8':stcgal_protocol = 'auto'

详细内容为:

# Copyright 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.import sys
from os.path import joinfrom SCons.Script import ARGUMENTS, AlwaysBuild, Default, DefaultEnvironmentdef __getSize(size_type, env):# FIXME: i don't really know how to do this right. see:#        https://community.platformio.org/t/missing-integers-in-board-extra-flags-in-board-json/821return str(env.BoardConfig().get("build",{# defaults"size_heap": 1024,"size_iram": 256,"size_xram": 65536,"size_code": 65536,},)[size_type])def _parseSdccFlags(flags):assert flagsif isinstance(flags, list):flags = " ".join(flags)flags = str(flags)parsed_flags = []unparsed_flags = []prev_token = ""for token in flags.split(" "):if prev_token.startswith("--") and not token.startswith("-"):parsed_flags.extend([prev_token, token])prev_token = ""continueif prev_token:unparsed_flags.append(prev_token)prev_token = tokenunparsed_flags.append(prev_token)return (parsed_flags, unparsed_flags)env = DefaultEnvironment()
platform = env.PioPlatform()
board_config = env.BoardConfig()env.Replace(AR="sdar",AS="sdas8051",CC="sdcc",LD="sdld",RANLIB="sdranlib",OBJCOPY="sdobjcopy",OBJSUFFIX=".rel",LIBSUFFIX=".lib",SIZETOOL=join(platform.get_dir(), "builder", "size.py"),SIZECHECKCMD="$PYTHONEXE $SIZETOOL $SOURCES",SIZEPRINTCMD='"$PYTHONEXE" $SIZETOOL $SOURCES',SIZEPROGREGEXP=r"^ROM/EPROM/FLASH\s+[a-fx\d]+\s+[a-fx\d]+\s+(\d+).*",PROGNAME="firmware",PROGSUFFIX=".hex",
)env.Append(ASFLAGS=["-l", "-s"],CFLAGS=["--std-sdcc11"],CCFLAGS=["--opt-code-size",  # optimize for size"--peep-return",  # peephole optimization for return instructions"-m%s" % board_config.get("build.cpu"),],CPPDEFINES=["F_CPU=$BOARD_F_CPU", "HEAP_SIZE=" + __getSize("size_heap", env)],LINKFLAGS=["-m%s" % board_config.get("build.cpu"),"--iram-size",__getSize("size_iram", env),"--xram-size",__getSize("size_xram", env),"--code-size",__getSize("size_code", env),"--out-fmt-ihx",],
)if int(ARGUMENTS.get("PIOVERBOSE", 0)):env.Prepend(UPLOADERFLAGS=["-v"])# parse manually SDCC flags
if env.get("BUILD_FLAGS"):_parsed, _unparsed = _parseSdccFlags(env.get("BUILD_FLAGS"))env.Append(CCFLAGS=_parsed)env["BUILD_FLAGS"] = _unparsedproject_sdcc_flags = None
if env.get("SRC_BUILD_FLAGS"):project_sdcc_flags, _unparsed = _parseSdccFlags(env.get("SRC_BUILD_FLAGS"))env["SRC_BUILD_FLAGS"] = _unparsed#
# Target: Build executable and linkable firmware
#target_firm = env.BuildProgram()if project_sdcc_flags:env.Import("projenv")projenv.Append(CCFLAGS=project_sdcc_flags)AlwaysBuild(env.Alias("nobuild", target_firm))
target_buildprog = env.Alias("buildprog", target_firm, target_firm)#
# Target: Print binary size
#target_size = env.Alias("size", target_firm, env.VerboseAction("$SIZEPRINTCMD", "Calculating size $SOURCE")
)
AlwaysBuild(target_size)#
# Target: Upload firmware
#upload_protocol = env.subst("$UPLOAD_PROTOCOL")
upload_actions = []if upload_protocol == "stcgal":f_cpu_khz = int(board_config.get("build.f_cpu").strip("L")) / 1000stcgal_protocol = board_config.get("upload.stcgal_protocol")if stcgal_protocol == 'stc8':stcgal_protocol = 'auto'env.Replace(UPLOADER=join(platform.get_package_dir("tool-stcgal") or "", "stcgal.py"),UPLOADERFLAGS=["-P",stcgal_protocol,"-p","$UPLOAD_PORT","-t",int(f_cpu_khz),"-a","-D"],UPLOADCMD='"$PYTHONEXE" "$UPLOADER" $UPLOADERFLAGS $SOURCE',)upload_actions = [env.VerboseAction(env.AutodetectUploadPort, "Looking for upload port..."),env.VerboseAction("$UPLOADCMD", "Uploading $SOURCE"),]# CH55x upload tool
elif upload_protocol == "ch55x":env.Replace(UPLOADER="vnproch55x",UPLOADERFLAGS=["-f"],UPLOADCMD="$UPLOADER $UPLOADERFLAGS $BUILD_DIR/${PROGNAME}.bin",)upload_actions = [env.VerboseAction(" ".join(["$OBJCOPY","-I","ihex","-O","binary","$SOURCE","$BUILD_DIR/${PROGNAME}.bin",]),"Creating binary",),env.VerboseAction("$UPLOADCMD", "Uploading ${PROGNAME}.bin"),]# custom upload tool
elif upload_protocol == "custom":upload_actions = [env.VerboseAction("$UPLOADCMD", "Uploading $SOURCE")]else:sys.stderr.write("Warning! Unknown upload protocol %s\n" % upload_protocol)AlwaysBuild(env.Alias("upload", target_firm, upload_actions))#
# Setup default targets
#Default([target_buildprog, target_size])

这篇关于platformio烧写STC8H1K08单片机程序失败:Serial port error: read timeout的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1083322

相关文章

java程序远程debug原理与配置全过程

《java程序远程debug原理与配置全过程》文章介绍了Java远程调试的JPDA体系,包含JVMTI监控JVM、JDWP传输调试命令、JDI提供调试接口,通过-Xdebug、-Xrunjdwp参数配... 目录背景组成模块间联系IBM对三个模块的详细介绍编程使用总结背景日常工作中,每个程序员都会遇到bu

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

504 Gateway Timeout网关超时的根源及完美解决方法

《504GatewayTimeout网关超时的根源及完美解决方法》在日常开发和运维过程中,504GatewayTimeout错误是常见的网络问题之一,尤其是在使用反向代理(如Nginx)或... 目录引言为什么会出现 504 错误?1. 探索 504 Gateway Timeout 错误的根源 1.1 后端

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

SpringBoot整合Dubbo+ZK注册失败的坑及解决

《SpringBoot整合Dubbo+ZK注册失败的坑及解决》使用Dubbo框架时,需在公共pom添加依赖,启动类加@EnableDubbo,实现类用@DubboService替代@Service,配... 目录1.先看下公共的pom(maven创建的pom工程)2.启动类上加@EnableDubbo3.实