2016-11-08 255 views
3

背景:我试图在PXE获取IP地址时自动重启服务器。这是为了重现问题,重现的唯一方法是在每次重启的同时冷启动它。我厌倦了这样做手动,并花了大概10个小时在这个脚本和故障排除到目前为止..无法打开串口或从串口读取pyserial

我试图从串行控制台读取服务器上的行,而寻找一个特定的字符串,然后发出重新启动命令。

现在,我可以让这个脚本回应串口控制台上出现的内容的唯一方法是关闭服务器,启动minicom,打开服务器电源,当文本启动时,我可以退出minicom而无需重置,然后启动我的脚本。

第一次通过,该脚本能正常工作,甚至将iLO在结束工作命令,然后将重新启动while循环,但我没有得到从控制台的任何输出了。

看来,我要么不正确打开串口,但我打印get_settings和波特率,停止位等,都是正确的。

我已搜查和使用的代码片段来自许多不同的地方砍起来这个剧本,而且我真的感到沮丧,我不能让这个对自己的工作。

[[email protected] ~]# python2 bootorder.py 
{'parity': 'N', 'baudrate': 115200, 'bytesize': 8, 'xonxoff': False, 'rtscts': False, 'timeout': None, 'inter_byte_timeout': None, 'stopbits': 1, 'dsrdtr': False, 'write_timeout': None} 

正如你可以在上面看到,当我有它运行,我打印出来的串口设置,并且它们匹配小型机和服务器端的串行控制台。

那么minicom如何开启我在脚本中没有做的端口?我遵循许多网站的例子,有时它确实有用,但我无法弄清楚如何独立完成这项工作。

这里是我的脚本:

#!/usr/bin/python 

import io 
import hpilo 
import os 
import sys 
import time 
import serial 
from datetime import datetime 

outfile='/tmp/bootordercount.txt' 
# configure the serial connections (the parameters differs on the device you are connecting to) 
port = '/dev/ttyS0' 
ser = serial.Serial(port,115200,timeout=None) 
cycles = 1 

if ser.isOpen(): ser.close() 
ser.open() 

if ser.isOpen(): 

    try: 
#  ser.flushInput() #flush input buffer, discarding all its contents 
#  ser.flushOutput()#flush output buffer, aborting current output 
       #and discard all that is in buffer 
    print(ser.get_settings()) 
    with open(outfile, 'a') as f: 

     while ser.isOpen(): 
      line = ser.readline() 
      print line 
      if "CLIENT IP:" in line: 
       print "Client string seen!" 
       ilo = hpilo.Ilo('10.0.8.203', 'administrator', 'password') #configure ilo function 
       ilo.cold_boot_server() #cold boot the server 
       print cycles 
    #   f.write(datetime.utcnow().isoformat() + '\t' + cycles + '\n') 
    #   f.flush() 
       cycles += 1 

    except Exception, e1: 
     print "error communicating...: " + str(e1) 
     ser.close() 

谢谢你的投入和帮助!

+0

也是我认为的readline部分是正确的,因为它的工作原理正确一次性通过,但周期后,我从串口退出获取数据,或readline的停止工作..不知道它.. –

回答

0

它可能保存的东西做的其他线路中的串行端口:DTR,DSR等。它们的使用往往是不一致的,它们通常用于比他们用于其他用途。

也许minicom使用DTR来初始化连接。尝试在串行open之后添加此项。

s.setDTR(False) 
sleep(0.025) 
s.setDTR(True)