Pyserial, когда я должен использовать грипп sh? - PullRequest
1 голос
/ 04 мая 2020

Я работаю с pyserial и пытаюсь записывать и читать данные на плату Arduino и с нее. Я видел несколько примеров, показывающих, что грипп sh должен использоваться при чтении и письме. Я не мог понять, какова роль гриппа sh даже после прочтения документации на pyserial. Я также заметил, что есть:

flushInput()
flushOutput()
flush()

Какова роль каждого из них, почему и когда я должен его использовать. Буду признателен за объяснение.

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

[Цитаты из документации по pySerial API ]

flushInput ()

"Устаревшее с версии 3.0: см. reset_input_buffer ()"
" Flu sh входной буфер, отбрасывающий все его содержимое. "

Обычно используется только после изменения параметров последовательного порта или для восстановления после ошибок.


flushOutput ()

"устарело с версии 3.0: см. reset_output_buffer () "
"Очистить буфер вывода, прерывая текущий вывод и отбрасывание всего, что находится в буфере.

Обратите внимание, что для некоторых последовательных USB-адаптеров это может быть только flu sh буфер ОС, а не все данные, которые могут присутствовать в части USB. "

Обычно используется только как часть процедуры прерывания.


flu sh ()

" Flu sh файловоподобных объектов. В этом случае дождитесь записи всех данных. "

В термине POSIX ios жаргон, это fu Функция известна как tcdrain () .
Остерегайтесь того, что «flu sh» и «сток» иногда (путанно) используются взаимозаменяемо для «ожидания, пока вся передача не будет done "function.
Но термин" flu sh "также может использоваться для обозначения" discard "(например, как в старых именах функций flushXput ()).
Например, обратите внимание на продолжающееся непоследовательное использование слово "flu sh" в документации по pySerial API даже после переименования двух функций, чтобы уменьшить путаницу.
Поэтому, когда вы видите слово "flu sh", вы должны проверить, что оно означает (то есть разрушительное удаление или неразрушающая операция ожидания) в этом контексте.

Эта функция flu sh () обычно не требуется в программах, особенно когда используется блокировка ввода / вывода (т. Е. ОС буферизует все данные и будет автоматически и эффективно иметь ваша программа ожидает при необходимости).
При использовании ОС ваша программа выполняется асинхронно относительно приема и передачи данных через последовательный порт. Только в ненормальных обстоятельствах (например, инициализация или восстановление после ошибок или полудуплексное программное обеспечение) ваша программа должна явно синхронизироваться с фактической передачей данных.

0 голосов
/ 04 мая 2020

грубое упрощение следует

pyserial (последовательный в общем) использует буфер связи (фактически 2)

один для ввода [ M | M | M | | | ]

и один для вывода [ | | | M | M ]

, если один из этих буферов заполнен, ничто другое не может go в этом буфере, и это может блокировать выполнение программы

flu sh ... говорит буферу выбросить его данные, поэтому новые данные могут начать поступать в

...