python - 如何在 python 串口上写入 ttyUSB0 将被解释的命令?

标签 python linux serial-port raspberry-pi zigbee

我有树莓派 PI B+,通过 USB 连接了 Telegesis ZigBee 模块(ETRX3 USB 内存棒)。使用命令:

    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. 您需要在您的 write() 后附加一个行尾

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

  2. 您应该将超时更改为:

    ser.timeout = None

否则 readline() 将在 2 秒后返回,即使没有读取任何内容也是如此。

关于python - 如何在 python 串口上写入 ttyUSB0 将被解释的命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25662489/

相关文章:

python - 测试成功,仍然得到回溯

c - 用 C 程序写入帧缓冲区非常慢(Raspberry Pi)

c - 串行编程 : Sender and Receiver

linux - i386-pc-mingw32-objdump pe 反汇编中止

c# - 为什么在 SerialPort.Open 和 Close 之前使用 Thread.Sleep()?

c# - 从 URI 创建流对象(TCP、串行)的工厂方法

python - 相当于 Drupal 的 CCK 和 View 模块的 Django 应用程序?

python - 如何使用字典创建动态类名?

python - 使用 Pandas DataFrame 计算每日 yield

java - hadoop程序编译时连接log4j报错