您的位置:首页 > 编程语言 > Python开发

python 实现将二进制文件发向串口,实现设备的串口升级

2018-02-08 13:37 495 查看
# -*- 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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: