Pyserial многопоточность случайно зависает после записи и нет данных на входном потоке в последовательном устройстве - PullRequest
0 голосов
/ 20 марта 2019

У меня есть компьютер с Windows, на котором я использую Pyserial для записи и чтения нескольких COM-портов с помощью многопоточной программы.

Работает в настройках у меня. Когда я запускаюсь на другом компьютере, после записи ответа на поток UART не вижу.

EDIT:

Я использовал функцию mtrace для отслеживания в Linux, он говорит, что возвращают None, это ничего не значит читать.

serialposix.py(483):                 ready, _, _ = select.select([self.fd, self.pipe_abort_read_r], [], [], timeout.time_left())
 --- modulename: serialutil, funcname: time_left
serialutil.py(139):         if self.is_non_blocking:
serialutil.py(141):         elif self.is_infinite:
serialutil.py(142):             return None

Хотите знать, что может вызвать проблему?

  • Я проверил эхо rx и tx путем укорачивания, и я вижу, что выводы правильные.

  • Я только что добавил ввод и сброс данных перед записью и чтением. Я проверил темы также без условий гонки.

  • Хотите знать, что некоторые буферы в UART неправильно очищены?

  • Есть ли у python какой-либо эквивалент Strace для отслеживания того, что происходит на fd?

Несмотря на то, что запись блокирует вызов для безопасной стороны, многопоточность добавила задержку 0,5 секунды.


Мой серийный код:

def serial_io():
    device = serial.Serial(COM1, baudrate=115200, bytesize=8, parity='N', stopbits=1,
            timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

    #reseting the ouput buffer here
    reset_output_buffer()

    packet = bytearray()
    packet.append(0x5A)
    packet.append(0xA5)
    packet.append(0x01)
    packet.append(0x20)
    packet.append(0x3D)
    packet.append(0xFF)
    packet.append(0x01)
    packet.append(0x00)
    packet.append(0xA1)
    packet.append(0xFE)

    device.write(packet)
    time.sleep(0.5)

    #resetting the input buffer here
    reset_input_buffer()
    run = True
    while run:
            data=device.readline()
            print(data)

            if (data == TEST_END):
                print("TEST DONE")
                run = False
                device.close()
...