Python3双向串口通信:读入数据

新手上路,请多包涵

我正在尝试通过 Python3 建立双向通信。有一个激光测距仪插入了我的一个 USB 端口,我想向它发送/接收命令。我有一张可以发送的命令以及它们将返回的内容,所以这部分已经存在了。

我需要的是一种方便的实时方式。到目前为止,我有以下代码:

 import serial, time

SERIALPORT = "/dev/ttyUSB0"
BAUDRATE = 115200

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.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 as e:
    print ("Exception: Opening serial port: " + str(e))

if ser.isOpen():
    try:
        ser.flushInput()
        ser.flushOutput()
        ser.write("1\r\n".encode('ascii'))
        print("write data: 1")
        time.sleep(0.5)
        numberOfLine = 0
        while True:
            response = ser.readline().decode('ascii')
            print("read data: " + response)
            numberOfLine = numberOfLine + 1
            if (numberOfLine >= 5):
                break
        ser.close()
    except Exception as e:
        print ("Error communicating...: " + str(e))
else:
    print ("Cannot open serial port.")

所以在上面的代码中,我发送了“1”,它应该触发激光探测器的“getDistance()”函数并返回以毫米为单位的距离。我在 Putty 上试过这个并且它有效,返回最多 4 位数的距离。但是,当我启动上面的 Python 脚本时,我的输出只有以下内容:

 Starting Up Serial Monitor
Exception: Opening serial port: Port is already open.
write data: 1
read data:

它永远存在。没有读取数据或任何内容。

我哪里错了?

原文由 Schütze 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 917
2 个回答

显然更简单的代码版本解决了这个问题。

 import serial
import time

ser = serial.Serial('/dev/ttyUSB0', 115200, timeout = 1) # ttyACM1 for Arduino board

readOut = 0   #chars waiting from laser range finder

print ("Starting up")
connected = False
commandToSend = 1 # get the distance in mm

while True:
    print ("Writing: ",  commandToSend)
    ser.write(str(commandToSend).encode())
    time.sleep(1)
    while True:
        try:
            print ("Attempt to Read")
            readOut = ser.readline().decode('ascii')
            time.sleep(1)
            print ("Reading: ", readOut)
            break
        except:
            pass
    print ("Restart")
    ser.flush() #flush the buffer

根据需要输出:

 Writing:  1
Attempt to Read
Reading: 20
Restart
Writing:  1
Attempt to Read
Reading:  22
Restart
Writing:  1
Attempt to Read
Reading:  24
Restart
Writing:  1
Attempt to Read
Reading:  22
Restart
Writing:  1
Attempt to Read
Reading:  26
Restart
Writing:  1
Attempt to Read
Reading:  35
Restart
Writing:  1
Attempt to Read
Reading:  36

原文由 Schütze 发布,翻译遵循 CC BY-SA 3.0 许可协议

试试这个代码

try:
  ser = serial.Serial("/dev/ttyS0", 9600) #for COM3
  ser_bytes = ser.readline()
  time.sleep(1)
  inp = ser_bytes.decode('utf-8')
  print (inp)
except:
  pass

原文由 Reyhaneh Trb 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进