简体   繁体   English

无法从串口读取数据

[英]Unable to read data from serial port

I tried to read data from USB port on OSX using pyserial.我尝试使用 pyserial 从 OSX 上的 USB 端口读取数据。 When I tried to read it using CoolTerm, everything worked fine.当我尝试使用 CoolTerm 阅读它时,一切正常。 This is the configuration:这是配置:

在此处输入图像描述

Then I tried to write a short script which doesn't continuously output the data (it outputs the data only once and the even if I restart the script, nothing comes out):然后我尝试编写一个不连续 output 数据的短脚本(它只输出一次数据,即使我重新启动脚本,也没有任何结果):

import serial
import time

ser = serial.Serial("/dev/cu.SLAB_USBtoUART", 115200, timeout=5, bytesize=8, stopbits=serial.STOPBITS_ONE, parity=serial.PARITY_NONE)


def getTFminiData():
    while True:
        # time.sleep(0.1)
        count = ser.in_waiting
        if count > 8:
            recv = ser.read(9)
            ser.reset_input_buffer()

            if recv[0] == 0x59 and recv[1] == 0x59:  # python3
                distance = recv[2] + recv[3] * 256
                strength = recv[4] + recv[5] * 256
                print('(', distance, ',', strength, ')')
                ser.reset_input_buffer()


if __name__ == '__main__':
    try:
        if ser.is_open == False:
            ser.open()
        getTFminiData()
    except KeyboardInterrupt:  # Ctrl+C
        if ser != None:
            ser.close()

Does anyone know what is the right way to get the same data as CoolTerm in this case does?有谁知道在这种情况下获取与 CoolTerm 相同的数据的正确方法是什么?

Thanks to Joe's comment, I fuggered out how to modify the code.多亏了乔的评论,我才弄清楚如何修改代码。 The working example is the following:工作示例如下:

import serial
import time

ser = serial.Serial("/dev/cu.SLAB_USBtoUART", 115200, bytesize=8, stopbits=serial.STOPBITS_ONE, parity=serial.PARITY_NONE)


def getTFminiData():
    bytes_read = 0
    data = None
    while True:
        # time.sleep(0.1)
        count = max(1, ser.in_waiting)
        if count < 8:
            if data is None:
                data = ser.read(count)
            else:
                data.append(ser.read(count))
            bytes_read += count

        else:
            recv = ser.read(9 - bytes_read)
            bytes_read = 0
            recv = data + recv
            data = None
            ser.reset_input_buffer()

            if recv[0] == 0x59 and recv[1] == 0x59:  # python3
                distance = recv[2] + recv[3] * 256
                strength = recv[4] + recv[5] * 256
                print('(', distance, ',', strength, ')')
                ser.reset_input_buffer()


if __name__ == '__main__':
    try:
        if ser.is_open == False:
            ser.open()
        getTFminiData()
    except KeyboardInterrupt:  # Ctrl+C
        if ser != None:
            ser.close()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM