首页 > 解决方案 > PySerial - 回车(\r)没有按预期工作

问题描述

我正在尝试使用 PySerial 通过串行(rs232)端口与板通信。

该板是瑞萨电子 rl78,下面是我的示例代码。(基本上我在这里尝试的是执行一些预定义的命令。所以这里commands又是一个返回其他命令列表的命令)

import serial, time, io

ser = serial.Serial()
ser.port = "/dev/cu.usbserial"
ser.baudrate = 19200 # as used for HyperTerminal
ser.timeout = 10 #non-block of 10 seconds
ser.bytesize = serial.EIGHTBITS
ser.parity=serial.PARITY_NONE
ser.stopbits=serial.STOPBITS_ONE
ser.xonoff = False
ser.rtscts = True
ser.dsrdtr = True
ser.dtr = True
ser.rts = True

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

if ser.is_open:

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

        #write data
        ser.write(b'commands\r')
        ser.reset_input_buffer()

        time.sleep(2)

        in_wait = ser.in_waiting

        while True:
            if in_wait != 0:
                output = ser.read(in_wait)
                print(output)
                break
            else:
                break

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

else:
    print "cannot open serial port "

从设备的角度来看,我们必须点击return(回车 \r) 才能使用任何终端应用程序执行命令。即 Mac 的超级终端或串行

所以上面的代码不返回任何输出,而只是一个空字符串(这是你在终端中点击返回 (\r) 时得到的内容)。该设备的行为就像它得到了一个返回 (\r) 并且该命令被完全忽略。

为了确保这不是 PySerial 的问题,我尝试使用 PySerial 的miniterm来获取此终端行为,并且我能够成功执行命令

同样,这里的问题是将 CR 设置为 EOL 以使命令成功执行。

python -m serial.tools.miniterm -e --eol=CR

所以我对我的代码有什么问题以及为什么它没有执行命令感到困惑。

标签: pythonserial-portpyserial

解决方案


推荐阅读