加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

在Linux上自动执行串口通讯

发布时间:2020-12-13 19:39:02 所属栏目:Linux 来源:网络整理
导读:我有一个 linux服务器(Red Hat 4),一个串行端口连接到一个嵌入式linux设备,另一个串行端口连接到该设备的电源控制器.我目前的控制方式是打开两个minicom会话,每个会话都在自己的窗口中.我想通过脚本自动化这种沟通.起初,我开始想到如何使用minicom自动化,然
我有一个 linux服务器(Red Hat 4),一个串行端口连接到一个嵌入式linux设备,另一个串行端口连接到该设备的电源控制器.我目前的控制方式是打开两个minicom会话,每个会话都在自己的窗口中.我想通过脚本自动化这种沟通.起初,我开始想到如何使用minicom自动化,然后意识到当脚本能够直接与端口通话时,我不需要尝试自动化使用控制台应用程序.

我知道一些Perl和一些python.我以前没有使用调制解调器通信的经验(使用AT命令). Perl拥有Device :: Modem,尽管它只是测试版,而且Perl似乎是一个不错的选择,因为我喜欢它的文本提取和争吵能力.但是,如果我需要学习如何控制调制解调器和编写/调试脚本,这将增加我的任务时间.

用脚本交互控制控制台应用程序(如minicom)是否可能/常见?如果没有,有什么好的资源让我学习如何使用调制解调器AT命令?还有那里有另一个资源可以简化我的事情?

解决方法

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 0x20000000n')
    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('echon')

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读