2014-09-04 114 views
3

我用樹莓派PI B +連接Telegesis ZigBee模塊(ETRX3 USB sticks)。使用命令:如何在python的串口上寫ttyUSB0會解釋命令?

debian:~# stty -F /dev/ttyUSB0 -raw ispeed 19200 ospeed 19200 
    debian:~# cat < /dev/ttyUSB0 & 
    debian:~# echo "ATI" > /dev/ttyUSB0 

的ZigBee模塊執行ATI命令,我可以看到正確的輸出:

Telegesis ETRX357 

    R308C 

    OK 

我想用python腳本做同樣的事情。我寫python腳本,代碼:

#!/usr/bin/env python 

    # based on tutorials: 
    # http://www.roman10.net/serial-port-communication-in-python/ 
    # http://www.brettdangerfield.com/post/raspberrypi_tempature_monitor_project/ 

    import serial, time 

    SERIALPORT = "/dev/ttyUSB0" 
    BAUDRATE = 19200 

    ser = serial.Serial(SERIALPORT, BAUDRATE) 

    ser.bytesize = serial.EIGHTBITS #number of bits per bytes 

    ser.parity = serial.PARITY_NONE #set parity check: no parity 

    ser.stopbits = serial.STOPBITS_ONE #number of stop bits 

    #ser.timeout = None   #block read 

    #ser.timeout = 0    #non-block read 

    ser.timeout = 2    #timeout block read 

    ser.xonxoff = False  #disable software flow control 

    ser.rtscts = False  #disable hardware (RTS/CTS) flow control 

    ser.dsrdtr = False  #disable hardware (DSR/DTR) flow control 

    ser.writeTimeout = 0  #timeout for write 

    print 'Starting Up Serial Monitor' 

    try: 
     ser.open() 

    except Exception, e: 
     print "error open serial port: " + str(e) 
     exit() 

    if ser.isOpen(): 

     try: 
      ser.flushInput() #flush input buffer, discarding all its contents 
      ser.flushOutput()#flush output buffer, aborting current output 

      ser.write("ATI") 
      print("write data: ATI") 
      time.sleep(0.5) 
      numberOfLine = 0 

      while True: 

       response = ser.readline() 
       print("read data: " + response) 

       numberOfLine = numberOfLine + 1 
       if (numberOfLine >= 5): 
        break 

      ser.close() 

     except Exception, e: 
      print "error communicating...: " + str(e) 

    else: 
     print "cannot open serial port " 

,並獲取搜索結果的屏幕

ATI 

上,但我想通過命令ZigBee模塊來執行,像在shell命令。我究竟做錯了什麼?

write on ttyUSB0

回答

1
  1. 你需要一個最終的行追加到您的write()

    ser.write("ATI\r\n")

  2. 你應該改變超時:

    ser.timeout = None

否則readline()將在2秒後返回,即使沒有讀取任何內容。