在Linux上自动化串口通信

13

我有一台安装了Red Hat 4的Linux服务器,其中一个串口连接到嵌入式Linux设备,另一个串口连接到该设备的电源控制器。目前我控制它们的方法是打开两个minicom会话,每个会话在自己的窗口中。我想通过脚本自动化这种通信方式。一开始,我考虑如何使用minicom进行自动化,后来意识到当脚本可以直接与端口通信时,不需要尝试使用控制台应用程序进行自动化。

我会一些Perl和Python。我没有以前使用调制解调器通信(使用AT命令)的经验。Perl有Device::Modem,但它只是beta版本,而且因为我更喜欢其文本提取和处理能力,所以Perl似乎是一个不错的选择。但是,如果我需要学习如何控制调制解调器并编写/调试脚本,那会增加我的任务时间。

是否可能/常见使用脚本交互地控制类似minicom的控制台应用程序?如果不行,那么有哪些好的资源可以让我学习如何使用调制解调器的AT命令?或者是否有其他资源可以为我简化事情?

5个回答

6

Kermit是一款串口通信应用程序,类似于minicom,并且它有自己的脚本语言。我曾经在嵌入式设备上使用它进行一些自动上传操作。但是,它相当受限和/或存在缺陷,因此我最终转而使用Python和pyserial。
每当您处理文本模式时,例如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')

谢谢!我发现minicom有一个叫做runscript的实用工具,虽然简单但足够使用。不过,非常感谢你的发布。将来我可能会发现它非常有用。 - jasper77

6
我发现了runscript(“$ man runscript”),这是一种将expect-like脚本能力添加到minicom中的实用工具。expect行为对我很有用,因为该设备使用专有的交互式引导序列。它很基础但足够使用。可以在启动minicom时使用“-S scriptname”标志调用脚本,并且可以将脚本中特定的文本发送到日志文件中,在从脚本运行minicom时非常有用。我没有找到将控制台内容发送到日志的方法,因此,让外部脚本知道minicom内部发生的情况涉及写入日志并使脚本监视日志。我计划仅使用runscript重新启动并进入shell,然后通过更高级别的语言脚本(如Python或Perl)ssh到设备进行真正的交互。如果没有安装minicom,我会采用shodanex的方法。
Runscript无法嵌套expect。我通过使用goto和label来解决这个问题,这可能比嵌套的expect更易读:
expect {
   "Condition 1"  goto lable1
}

lable1:
    send "something"
    expect {
       "Condition 2"  goto label2
    }
lable2:
    # etcetera

更正:当使用“-C logfilename”调用minicom时,控制台输出将被捕获到该文件中。 - jasper77
1
你的脚本中有错别字,“lable”和“label”不一致。 - Atilla Filiz
运行脚本看起来不错,但我找不到发送文件的方法,所以对我来说使用pyserial。 - austinmarton

3

我正在使用一款控制器,使用RS232进行控制。

我通过简单地发出以下命令,在bash中编写脚本:

echo "your-command" > /dev/ttyUSB0

我正在使用的具体设备也使用300波特率,所以我输入:

stty -F /dev/ttyUSB0 300

事先准备好。


2
如果只是控制设备而不涉及处理消息、与其他操作系统服务交互等,您可以使用聊天程序。它专门为此编写。 您可以在任何Linux发行版的ppp软件包中找到它。

感谢您告诉我关于聊天程序的事情。它可以解决我需求的一部分,但实际上在进入Shell之前,我必须能够下载并将新的Linux映像引导到此设备。该设备使用busybox。 - jasper77

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接