自己开发I2C Bootloader -上位机开发篇

上位机脚本开发

  在芯片原厂大部分工程师选择的脚本语言依然是Python, Python有哪些开发优势这里就不再讨论了,这里我们只陈述一下上位机的开发环境,作者的开发环境是VSCode + Anaconda。脚本内容也没有什么好说的,一看就懂,比较简单。唯一值得提醒的是本项目的上位机开发需要多注意*Write_DataBytes_To_Serial_Port(self, DataBytes):*函数的实现。要一次性将要发送的数据全部发送到下位机处理,不要有断帧。在Python语法处理上应该是用数据列表组织数据结构。这和我们的下位机设计的数据接收方式有关系。

import os
import sys
import serial
import serial.tools.list_ports
import struct
import threading
from time import sleep

class BOOTLOADER:
    def __init__(self):
        self.Serial_Port_Obj = None
        self.CBL_FLASH_ERASE_CMD          = 0x04
        self.CBL_MEM_WRITE_CMD            = 0x05
        self.CBL_MEM_READ_CMD             = 0x06
        self.CBL_JUMP_TO_APP_CMD          = 0x07
    def Check_Serial_Ports(self):
        Serial_Ports = []
        
        if sys.platform.startswith('win'):
            Ports = ['COM%s' % (i + 1) for i in range(256)]
        else:
            raise EnvironmentError("Error !! Unsupported Platform \n")
        for Serial_Port in Ports:
            try:
                test = serial.Serial(Serial_Port)
                test.close()
                Serial_Ports.append(Serial_Port)
            except (OSError, serial.SerialException):
                pass
        return Serial_Ports
    
    def Serial_Port_Configuration(self, Port_Number):
        try:
            self.Serial_Port_Obj = serial.Serial(Port_Number, 115200, timeout = 2)
        except:
            print("\nError !! That was not a valid port")
        
            Port_Number = self.Check_Serial_Ports()
            if(not Port_Number):
                print("\nError !! No ports Detected")
            else:
                print("\nHere are some available ports on your PC. Try Again !!")
                print("\n   ", Port_Number)
            return -1
        
        if self.Serial_Port_Obj.is_open:
            print("Port Open Success \n")
        else:
            print("Port Open Failed \n")

    def Write_DataBytes_To_Serial_Port(self, DataBytes):
        def write_databytes():
            self.Serial_Port_Obj.reset_input_buffer()
            self.Serial_Port_Obj.write(bytes(DataBytes))
            self.Serial_Port_Obj.flush()
        threading.Thread(target=write_databytes, daemon=True).start()

    def Read_Serial_Port(self, Data_Len):
        Serial_Value = self.Serial_Port_Obj.read(Data_Len)
        Serial_Value_len = len(Serial_Value)
        print("\n   Serial_Value_len: ", Serial_Value_len)
        while Serial_Value_len <= 0:
            Serial_Value = self.Serial_Port_Obj.read(Data_Len)
            Serial_Value_len = len(Serial_Value)
            print("Waiting Replay from the Bootloader")
        return Serial_Value

    def Word_Value_To_Byte_Value(self, Word_Value, Byte_Index, Byte_Lower_First):
        Byte_Value = (Word_Value >> (8 * (Byte_Index - 1)) & 0x000000FF)
        return Byte_Value
    
    def Calculate_CRC32(self, Buffer, Buffer_Length):
        CRC_Value = 0xFFFFFFFF
        for DataElem in Buffer[0:Buffer_Length]:
            CRC_Value = CRC_Value ^ DataElem
            for DataElemBitLen in range(32):
                if(CRC_Value & 0x80000000):
                    CRC_Value = (CRC_Value << 1) 

你可能感兴趣的:(嵌入式系统,python,stm32,单片机)