Kermit是一个串行通信应用程序,如minicom,它有自己的脚本语言,我用它在嵌入式设备上进行一些自动上传.然而,它是相当有限和/或buggy,所以我终于转而使用python和pyserial.
无论何时处理texte模式,如AT命令设置或通过串行线对shell进行通话,它真的很强大.
如果我需要使用一些标准协议进行二进制传输,我通常会使用非交互模式的命令行工具,并从我的python脚本中产生它们.
这里是我构建的工具的一部分:等待一些输入,通过xmodem发送数据,发送一个命令到u-boot并使用kermit协议开始传输.我用它来自动闪烁和测试嵌入式设备.
class Parser :
def __init__(self,sport_name):
self.currentMsg = ''
if sport_name :
self.ser = serial.Serial(sport_name,115200)
def WaitFor(self,s,timeOut=None):
self.ser.timeout = timeOut
self.currentMsg = ''
while self.currentMsg.endswith(s) != True :
# should add a try catch here
c=self.ser.read()
if c != '' :
self.currentMsg += c
sys.stdout.write(c)
else :
print 'timeout waiting for ' + s
return False
return True
def XmodemSend(self,fname):
if not self.WaitFor('C',1) :
print 'RomBOOT did not launch xmodem transfer'
return
self.ser.flushInput()
self.ser.close()
call(["xmodem","-d",self.ser.port,"-T",fname])
self.ser.open()
def UbootLoad(self,fname):
self.ser.write('loadb 0x20000000\n')
if not self.WaitFor('bps...',1) :
print 'loadb command Failed'
sys.exit()
self.ser.flushInput()
self.ser.close()
retcode=call(['kermit','-y','kermit_init','-s',fname])
if retcode != 0 :
print 'error sending' + fname
sys.exit()
self.ser.open()
self.UbootCmd('echo\n')