jas*_*r77 11 linux modem automated-tests serial-port
我有一个Linux服务器(Red Hat 4),其中一个串口连接到嵌入式linux设备,另一个串口连接到该设备的电源控制器.我目前控制它们的方法是打开两个minicom会话,每个会话都在自己的窗口中.我想通过脚本自动化这种通信.起初,我开始思考如何自动使用minicom,然后意识到当脚本应该能够直接与端口通信时,我不需要尝试使用控制台应用程序进行自动化.
我知道一些Perl和一些python.我以前没有使用调制解调器通信的经验(使用AT命令).Perl有Device :: Modem,虽然它只是beta版,而Perl似乎是一个不错的选择,因为我更喜欢它的文本提取和争吵能力.但是,如果我需要学习如何控制调制解调器并编写/调试脚本,那么我的任务就会增加更多时间.
是否可以通过脚本以交互方式控制控制台应用程序(如minicom)?如果没有,有什么好资源让我学习如何使用调制解调器AT命令?或者是否有其他资源可以简化我的事情?
Kermit 是一个类似于 minicom 的串行通信应用程序,它有自己的脚本语言,我用它在嵌入式设备上进行了一些自动上传。但是,它非常有限和/或有问题,所以我最终切换到使用 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')
Run Code Online (Sandbox Code Playgroud)
我发现了一个运行脚本("$ man runscript"),这个实用程序为minicom添加了类似于期望的脚本编写功能.期望行为对我很有用,因为此设备使用专有的交互式启动序列.这是基本但足够的.使用"-S scriptname"标志启动minicom时可以调用脚本,并且脚本中的特定文本可以发送到日志文件,这在从脚本运行minicom时很有用.我还没有找到将控制台内容发送到日志的方法,因此让外部脚本知道minicom内部发生了什么,包括写入日志并让脚本监视日志.我计划仅使用runscript重新启动并获取shell,然后在更高级别的语言脚本(如Python或Perl)中使用ssh到设备进行实际交互.如果minicom不是
Runscript不能有嵌套的期望.我通过使用goto和标签来解决这个问题,这可能比嵌套期望更具可读性:
expect {
"Condition 1" goto lable1
}
lable1:
send "something"
expect {
"Condition 2" goto label2
}
lable2:
# etcetera
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12574 次 |
| 最近记录: |