Невозможно прочитать данные из последовательного порта - PullRequest
0 голосов
/ 04 октября 2019

Я попытался прочитать данные с USB-порта на OSX, используя pyserial. Когда я попытался прочитать его с помощью CoolTerm, все работало нормально. Это конфигурация:

enter image description here

Затем я попытался написать короткий скрипт, который не выводит данные непрерывно (он выводит данные только один раз идаже если я перезапущу скрипт, ничего не выйдет):

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()

Кто-нибудь знает, как правильно получить те же данные, что и CoolTerm в этом случае?

1 Ответ

0 голосов
/ 04 октября 2019

Благодаря комментарию Джо я обдумал, как изменить код. Рабочий пример следующий:

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()
...