天天看點

python 實作将二進制檔案發向序列槽,實作裝置的序列槽更新

# -*- coding: utf-8 -*-

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Note  : you should use this script like this: python xxxxxx.py COMx  (python fwupThroughSeiral 17)
Env   : python v2.7.13
Author: zhangwl
Date  : 20180206
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

import serial
import time
import os
from sys import argv
from binascii import b2a_hex, a2b_hex



BAUDRATE = 115200
TIMEOUT = 0.05
BLOCKSIZE = 512

def readfile(filename, readLen):
    dataList = []
    
    fileSize = os.path.getsize(filename)
    blockNum = fileSize/readLen
    if fileSize%readLen != 0:
        blockNum += 1
    print "size %d, blockNum %d" % (fileSize, blockNum)
    
    with open(filename,'rb') as f:
        for i in range(blockNum):
            block = f.read(readLen)
            dataList.append(block.strip())
            # print "index %d:%s" % (i, block)
    f.close()        
    return dataList, blockNum


def sendCommandToDevice(COMx, cmdStr, expectedAck, TryTime):
    ack = 'no'
    for i in range(TryTime):
        num = COMx.write(cmdStr)
        ack = COMx.read(32)
        # print 'COM recv:%s' % ack
        if ack == expectedAck:
            break
    return ack


# -----------------
# main
# -----------------

if __name__ == "__main__":

    script, portNum = argv
    port = "COM%s" % (portNum)
    
    FWUP_START = "AT+&UPDM=1\r\n\r\n"
    FWUP_TRANS = "AT+&UPDD=512\r\n"
    FWUP_END = "AT+&UPDM=0\r\n\r\n"   
    START_OK = '+OK\r\n\r\n'
    TRANS_OK = '+OK=1\r\n\r\n'
    SET_OK = '+OK=-1\r\n\r\n'
    
    fwBlocks, blockNum =  readfile("../WM_VENUS_SEC.img", BLOCKSIZE)   
    '''
    for i in range(blockNum):
        print 'fwBlocks[%d]:%d' % (i,len(fwBlocks[i]))
    '''
    
    try:
        COM = serial.Serial(port, BAUDRATE, timeout = TIMEOUT)
        
        for i in range(0, blockNum, 1):
            response = sendCommandToDevice(COM, FWUP_START, START_OK, 5)
            if response == START_OK:         
                response = sendCommandToDevice(COM, FWUP_TRANS, SET_OK, 5)
                if response == SET_OK:
                    response = sendCommandToDevice(COM, fwBlocks[i], TRANS_OK, 5)
                    if response == TRANS_OK:
                        print "fwBlocks[%d] OK" % i
                    else:
                        print "fwBlocks[%d] Fail" % i
                        # i -= 1;
            
        response = sendCommandToDevice(COM, FWUP_END, START_OK, 5)
        if START_OK == response:
            print "set OK"
        else:
            print 'set Fail'
        COM.close()
        print 'Steps over, COM close.'
        
    except Exception,e:
        print 'str(Exception):', str(Exception)
        print 'str(e):', str(e)