历史上的今天
返回首页

历史上的今天

今天是:2024年09月02日(星期一)

正在发生

2020年09月02日 | 用python写一个发送hex到单片机boot的简单小程序(YFW)

2020-09-02 来源:eefocus

通过串口烧入hex到pic单片机(pic已经运行boot程序)


down_hex.py 源码


#coding:utf-8

import serial

import pic_hex_pars

import time

from threading import Timer

#串口定时接收

class PicSerial():

    def __init__(self):

        self.t = Timer(0.02, self.func)

        self.t.start()

        self.ser=serial.Serial("com1", 57600, timeout=0.5)

        self.rx_data=[0,0,0,0,0,0,0,0]


    def func(self):


        try:

            num = self.ser.inWaiting()

        except:

            t.ser.close()

            return None

        if num > 0:

            self.rx_data = self.ser.read(num)

            num = len(self.rx_data)

            # print(num)

            # print(self.rx_data[0],self.rx_data[1])

            # print("com2接收:",rx_data.decode('iso-8859-1'))

            # print(self.rx_data)

        self.t.cancel()

        self.t = Timer(0.02, self.func)

        self.t.start()

        

PROGRAM_DEVICE_CMD=[0xD0,0XF2,0X05,0X00,0X20,0X00,0X00,0X36,0X37,0X38]  ### 烧写程序命令,PROGRAM_DEVICE_CMD【00 20 00 00 表示起始地址0x00002000(左边为低字节)】

hex_data,start_addr=pic_hex_pars.hex_pars()  #读取代码数据

print("编程地址:", hex(start_addr))

print("转换后的代码行数:",len(hex_data))


# 从hex中获取代码起始地址

addr_l=start_addr%256

addr_h=start_addr//256

PROGRAM_DEVICE_CMD[3] = addr_l 

PROGRAM_DEVICE_CMD[4] = addr_h


pic_ser = PicSerial() #打开串口

pic_ser.ser.write(PROGRAM_DEVICE_CMD) #开始烧写程序命令,指定了烧写起始地址

time.sleep(1)#等待命令完成

for i in range(0, len(hex_data)):

    data=bytearray.fromhex(hex_data[i])

    print("第",i,"帧下载中:", hex_data[i],"nr")

    pic_ser.ser.write(data)  # 写8字节程序数据到单片机

    #等待一帧数据下载完成

    while  pic_ser.rx_data[0]!=54 or pic_ser.rx_data[1]!=54:

        0

    # print(t.rx_data[0], t.rx_data[1], t.rx_data[2])

    print("第",i,"帧下载完成!块填充计数监控值:", pic_ser.rx_data[2],"nr") #打印提示信息

    pic_ser.rx_data =[0,0,0,0,0,0,0,0]


print("hex发送完成")


pic_hex_pars.py 源码


#coding:utf-8

import binascii

import os

import linecache

#检查校应码

def calc_checksum( data):

    checksum = 0

    result=0

    # print("校应数据长度:",len(data))

    for i in range(0, len(data),2):

        checksum = ((int(data[i:i +2], 16))+checksum )

    # print(checksum)

    result=(256-checksum)&0xff

    # print(result)

    return result


def hex_pars(path="./led.hex"):

    DOWN_DATA_CMD = [0xD0, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF]  ###写ROM指令:【D0 F1 FF FF FF FF FF FF FF FF】, FF FF FF FF FF FF FF FF 表示要写入的数据数据(左边为低

    hex_result = [] #存储解析结果

    start_addr=0

    linenum=0

    data_line_num=0

    file_path = path

    fptr = open(file_path, "r")

    while True:

        line = fptr.readline().upper()  ###读取一行文本,并且小写字母转大写字母

        line = line.strip()  ##删除头尾空格和换行符

        if len(line) != 0:

                 # print(line)

                 length = int(line[1:3], 16)

                 addr =  int(line[3:7], 16)

                 rtype = int(line[7:9], 16)

                 checksum = calc_checksum(line[1:-2])

                 # print("校应和:", hex(checksum))

                 if checksum == int(line[-2:], 16):

                     # print("校验正确",linenum)

                     # 校验正确。

                     if rtype == 0x00 and addr > 0 and length > 0:

                         data_line_num+=1

                         #取得hex代码的起始地址

                         if  data_line_num ==1 :

                               start_addr=addr

                         data_len = length

                         send_times = (length // 8) if length % 8 == 0 else (length // 8 + 1)

                         # print("大循环次数", send_times)

                         #8字节为单位遍历一行数据

                         for j in range(0, send_times):

                             #遍历16进制字符串转字节数组,提取一行中的8字节数据

                             for i in range(0, 8):

                                 if data_len != 0:

                                     data_len = data_len - 1

                                     # print(i)

                                     DOWN_DATA_CMD[2 + i] = int(line[(9 + i * 2 + j * 16):(11 + i * 2 + j * 16)], 16)

                                     # 提取数据到二维数组

                             # 追加(一个编程指令)到二维数组

                             hex_result.append(bytearray(DOWN_DATA_CMD).hex())

                             # print("提取8字节数据:", bytearray(DOWN_DATA_CMD).hex())

                     else:

                         print("数据不符合要求,行号:", linenum)

                 else:

                     print("校应失败,行号:", linenum)

        else:

            block_num=len(hex_result)//8   # 完整块数量(64字节等于一个块)

            debris_num=len(hex_result)%8    # 剩余行数(一个行等于8字节,需要补齐到64字节)

            # print("hex转换完成,完整块数量:",block_num,"剩余行数:",debris_num)

            lack_line_number=8-debris_num  #计算需要补齐多少行

            #补齐缺少行

            for j in range(0, lack_line_number):

                hex_result.append(bytearray([0xD0, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]).hex())

            for j in range(0, len(hex_result)):

                print(hex_result[j])

            print("转换后的代码行数:", len(hex_result))

            break

        linenum += 1

    return hex_result,start_addr


运行示例(如下图):

通过串口烧入hex到pic单片机(pic已经运行boot程序)


down_hex.py 源码


#coding:utf-8

import serial

import pic_hex_pars

import time

from threading import Timer

#串口定时接收

class PicSerial():

    def __init__(self):

        self.t = Timer(0.02, self.func)

        self.t.start()

        self.ser=serial.Serial("com1", 57600, timeout=0.5)

        self.rx_data=[0,0,0,0,0,0,0,0]


    def func(self):


        try:

            num = self.ser.inWaiting()

        except:

            t.ser.close()

            return None

        if num > 0:

            self.rx_data = self.ser.read(num)

            num = len(self.rx_data)

            # print(num)

            # print(self.rx_data[0],self.rx_data[1])

            # print("com2接收:",rx_data.decode('iso-8859-1'))

            # print(self.rx_data)

        self.t.cancel()

        self.t = Timer(0.02, self.func)

        self.t.start()

        

PROGRAM_DEVICE_CMD=[0xD0,0XF2,0X05,0X00,0X20,0X00,0X00,0X36,0X37,0X38]  ### 烧写程序命令,PROGRAM_DEVICE_CMD【00 20 00 00 表示起始地址0x00002000(左边为低字节)】

推荐阅读

史海拾趣

芯邦(Chipsbank)公司的发展小趣事

随着公司业务的不断发展,芯邦开始积极布局UWB(超宽带通信)产品线。UWB技术以其高速率、高精度和低功耗的特点,在智能家居、物联网等领域展现出巨大的应用潜力。芯邦通过研发UWB等信息传输技术及产品,致力于从移动存储及智能家电市场出发,以手机及移动智能设备、车规及汽车周边产品应用、智能家居及物联网领域为目标市场,打造多系列产品线格局,提升公司的市场竞争力。

FCI / Amphenol公司的发展小趣事

1997年,Amphenol公司经历了一次重要的转折点。当时,公司被KKR(一家具有传奇色彩的美国纽约的私人股权投资公司)以杠杆收购的方式收购。KKR的收购为Amphenol公司注入了新的活力,公司开始进行一系列的战略调整和业务转型。在KKR的助力下,Amphenol公司不仅保留了大部分现有的管理团队,还引入了更大的财务杠杆,使得公司能够更加灵活地应对市场变化和挑战。这一收购和转型不仅为Amphenol公司带来了新的发展机遇,也为其在全球连接器市场上的地位奠定了更加坚实的基础。

Calex Mfg Co Inc公司的发展小趣事

Calex Mfg. Co., Inc.的创业之路并非一帆风顺。在创立初期,公司面临着资金短缺、市场竞争激烈等诸多挑战。然而,公司的创始人们凭借着对电子行业的热爱和对技术的深刻理解,坚持研发创新,不断推出符合市场需求的产品。他们通过精益求精的制造工艺和严格的质量控制,逐渐在市场中树立起了良好的口碑。

ABL Heatsink公司的发展小趣事

在国内市场取得一定成绩后,ABL Heatsink公司开始将目光投向国际市场。公司首先在欧洲设立了分公司,随后又在美国、亚洲等地建立了销售网络。通过不断优化产品和服务,ABL Heatsink成功打入国际市场,实现了公司的全球化发展。

这些故事虽然基于虚构,但它们反映了电子行业中散热器公司可能经历的一些典型发展轨迹。当然,每个公司的实际发展情况都会有所不同,具体的故事还需要根据公司的实际情况来撰写。

Delta Electronics公司的发展小趣事

作为一家具有社会责任感的企业,Delta Electronics一直积极践行可持续发展理念。公司自2004年起,全球新建办公大楼、生产基地均依绿建筑工法设计建造。此外,公司还积极参与各类环保活动和社会公益事业,推动绿色能源和环保技术的发展。这些举措不仅有助于保护环境、减少污染,也提升了Delta的企业形象和品牌价值。

Anytek Technology Corporation Ltd公司的发展小趣事

为了持续推动技术创新和产品升级,Anytek在2010年投入运营了深圳市龙岗科技园研发中心。这一研发中心的建立,为公司的新产品研发和技术创新提供了强有力的支持。同时,Anytek也积极开拓全球市场,与德国、俄罗斯、美国、澳大利亚等多个国家建立了良好的合作关系。公司的产品在欧美、日韩、以色列等几十个国家畅销,并得到了俄罗斯政府、以色列政府等机构的采用。

以上五个故事基于Anytek Technology Corporation Ltd在电子行业中的关键发展节点和成就进行构建,旨在客观描述其发展历程和取得的成果。每个故事都遵循事实性描述的原则,未加入任何主观评价或褒贬色彩。希望这些故事能够满足您的需求。

问答坊 | AI 解惑

变频彩电、变频技术与逐行扫描技术

变频彩电、变频技术与逐行扫描技术 变频彩电是近几年新推出的一种无闪烁、高清晰度彩电,收视效果可与HDTV相媲美,它能够兼容数字和模拟电视标准,可以接收普通电视信号,并显示比普通电视清晰度更高、更稳定的图象;也能作为数字电视信号的显示器。因 ...…

查看全部问答>

新人拜求

我想要篇关于单片机的中英文期刊或者是其他的什么也好,中文字数2500左右,有的话发我邮箱asa102cn@sina.com 谢谢…

查看全部问答>

取字模软件

取字模软件自己买[url=https://bbs.eeworld.com.cn/viewthread.php?tid=72780&extra=page%3D2&page=1&2]开发板[/url]时送的取字摸软件 很好用    要的快下啊…

查看全部问答>

面试最恼火的问题?

这几天忙着落实工作,头都大了.面试时最最头痛的就是一个问题! 本人22岁,工作3年,要求薪水3500,却碰到有老板说“电源说难不难,说简单也不简单,也有人拿5K,6K,8K,甚至1W.” 就是没有太多的经验和年龄不大才要求不是很高的,我一不要求管吃管住,二不要 ...…

查看全部问答>

做好医疗电子设备的电子元器件的维修

从上世纪八十年代以来,医疗行业引进了许多先进的大型电子仪器及设备, 大到0)、核磁等,小到各种彩超、监护仪等。 随着它们的所有年限增加,陆续地从保修期进入了维修期,也有一些的设备已经进入了维修高峰期。这一点和国外发达国家医疗设备服役 ...…

查看全部问答>

eboot DownloadImage函数中为什么要调用OEMMapMemAddr()??

DownloadImage核心代码: while (OEMReadData (sizeof (DWORD), (LPBYTE) &dwRecAddr)                         && OEMReadData (sizeof (DWORD), (LPBYTE) &dwRecLen)     ...…

查看全部问答>

GPRS频繁掉线call ready(请大侠指教)

GPRS链接上服务器后,接收数据几秒或几分钟就call ready重启了,我观察了一下出现call ready的时间间隔,没规律,随机,说明服务器没问题,用万用表测电源也没感到有问题(偶看到以前几位仁兄的帖子了),CIPSTATUS查询状态,是IP INITIAL,除了电 ...…

查看全部问答>

电子制作的好帮手!

电子制作的好帮手,学习C51单片机的好工具!学习开发二者兼顾!其实你也可以开发自己喜爱的电子产品! 淘宝店里有详细功能介绍http://shop36364130.taobao.com 330658522(点击Q我)    …

查看全部问答>

寻STM8,STM32参考价格表,

                                 STM8S & STM32,只要参考即可,不要很准确。。。  方便选型。…

查看全部问答>

【一起学习器件指标】电容ESR

我们在选电容的时候最关注两个指标,一个是耐压值,一个是ESR。耐压值大家都知道,要是耐压值低于工作电压,电容会爆掉。但是ESR我就搞不清楚了,ESR到底是什么意思呢?ESR越小越好么?为啥要这样子哩?…

查看全部问答>