做MTK开发也有一段时间,最近做一个产品,其中有一个测试功能,MTK自带的PC suit(PC同步工具)好像有问题一
直连接不上,所以无法使用,由于该功能是提供给测试部做测试使用,于是自己动手写了一段代码。
python原来没有用过,今天暂时看了一下,找了一段代码进行修改,主要参考两份文档,一份是python的语法,还有一份是pySerial这个类的使用,网址如下:
http://www.cnblogs.com/starspace/archive/2009/02/20/1394603.html
代码写完了,基本功能是没有问题,贴出来给大家参考使用。主要是对AT和操作,
# -*- coding=cp936 -*- #author:[email protected] #datetime:2009-4-27 #comment:这个小程序主要用于测试MTK话机的电话本容量与短信箱的容量 #当然,也可以通进扩展,改造与PC端同步工具,MTK自带的软件也就是通过AT方式进行与终端同步信息 #ATClass这个类做为基类,一般不进行修改 #通过继承把业务相关放在MTKTest这个类中,小程序是用一天时间完成了,基本上满意我们公司测试部的要求 #大家可以把修改意见发到我邮箱,本人将不断完善。 import time, re, sys, os #import sms from cStringIO import StringIO import serial ENCODING = 'cp936' OK = '\r\nOK\r\n' FLUSH_TIMEOUT = 0.1 READ_TIMEOUT = 20 SEND_TIMEOUT = 20 RESET_RETRIES = 5 BAUDRATE=115200 class ATClass: def __init__(self, port,baudrate): try: self.timeout = READ_TIMEOUT self.ser = serial.Serial(port, baudrate=baudrate, timeout=FLUSH_TIMEOUT, rtscts=0) self.buff = '' except: print '串口初始化失败' sys.exit(0) def opencomm(self): try: self.ser.open() except: print '打开串口失败' sys.exit(0) def reset(self): for i in range(RESET_RETRIES): try: self.at_command('ATZ\r\n', OK) self.at_command('ATE0\r\n', OK) # must turn the echo off return 'OK' except TimeoutException: pass raise ResetException, "Unable to reset" def flush(self): while self.ser.read(1024): pass def at_command(self, text, response=None, timeout=SEND_TIMEOUT): self.flush() self.ser.write(text) return response and self.wait_for(response, timeout) def wait_for(self, response, timeout=READ_TIMEOUT): end = (timeout or self.timeout) + time.time() result = '' while time.time() < end: data = self.ser.read(1) if len(data): result += data if result.endswith(response): return result return False def at(self): try: return self.at_command('AT\r\n', OK) except TimeoutException: return '' def close(self): self.ser.close() def error_code(text): match = re.match(r'\r\n\+CMS ERROR: (\d+)\r\n', text) return match and int(match.group(1)) class MTKTest (ATClass): def __init__(self, com, rate): ATClass.__init__(self, com, rate) def addOnePhoneTest(self,i): data = 'AT+CPBW='+str(i)+',"'+str(i)+'",129,"name'+str(i)+'"\r\n' return self.at_command(data, OK) def addOneSMSTest(self,i): strRespone = '' data = 'AT+CMGW="10086","STO SENT"\r\n' # data = 'AT+CMGW="10086","REC UNREAD"\r\n' #保存到收件箱未读短信 # data = 'AT+CMGW="10086","REC READ"\r\n' #保存到收件箱已读短信 # data = 'AT+CMGW="10086","STO UNSENT"\r\n' #保存到发件箱中的未发送短信 # data = 'AT+CMGW="10086","STO SENT"\r\n' #保存到发件箱中的已发送短信 strRespone = self.at_command(data, '\r\n>') if strRespone.find('>')>0: data = 'linhai'+str(i)+'\x1A' strRespone = self.at_command(data, OK) if strRespone.find('OK')>0: return True else: print '添加短信失败' return False #添加短信测试 def addSMSTest(self): #设置短信方式为TEXT格式,注意,这种格式不能发中文 data = 'AT+CMGF=1\r\n' strRespone = self.at_command(data, OK,SEND_TIMEOUT) print '**************bgein add sms test**************' count = 0 i = 0 strRespone = '' for i in range(10): try: strRespone = self.addOneSMSTest(i) if strRespone == False: count = count+1 if count ==3: print '错误超过三次,退出添加短信测试' return False else: print '添加短信成功:'+str(i) print '-----------------------------------' except: pass print '\r\n**************结束添加短信测试**************' #添加电话本测试 def addPhoneTest(self): print '**************bgein add phone test**************' #设置电话本存储的位置 data = 'AT+CPBS="me"'#me为保存在终端 #data = 'AT+CPBS="sm"' #sm为保存为SIM卡 self.at_command(data, OK) count = 0 i = 0 strRespone = '' for i in range(1000): try: strRespone = self.addOnePhoneTest(i) if strRespone == False: count = count+1 print '添加电话本:'+str(i) print '错误!!!真实返回: Error\r\n期望:OK' if count ==3: print '错误超过三次,退出添加电话本测试' return False else: print '添加电话本成功:'+str(i) print '-----------------------------------' except: pass print '\r\n**************结束添加电话本测试**************' class SerialException(Exception): def __init__(self, text): print 'exception ' ,text self.text = text code = error_code(text) if not code is None: print 'error code %d' % code def __repr__(self): return self.text class TimeoutException(SerialException): pass class ResetException(SerialException): pass if __name__=='__main__': try: #说明:com port 1使用参数0 我机子上是comport7所以使用6 mtkTest = MTKTest(6,115200) mtkTest.opencomm() mtkTest.reset() # mtkTest.addPhoneTest() mtkTest.addSMSTest() finally: mtkTest.close()
这个工程使用eclipse+python+pyserial-2.2.win32.exe
以上文件都可在网络上很方便的下载到。附件是上面代码的py文件。
注意:一定要使用python2.4版本,主要原因是我使用的pyserial-2.2.win32,这个东东它支持的是2.4版本.
在使用python时,感觉它的版本好多