pyserial-можно записать в последовательный порт из потока a, блокировать чтение из потока b?

Я попытался погуглить это, не смог найти ответ, искал здесь, не смог найти ответ. Кто-нибудь смотрел, безопасно ли записывать в последовательный() объект (pyserial) из потока a и блокировать чтение из потока b?

Я знаю, как использовать примитивы синхронизации потоков и потокобезопасные структуры данных, и на самом деле моя текущая форма этой программы имеет поток, посвященный чтению / записи на последовательном Порту, и я использую потокобезопасные структуры данных для координируйте действия в приложении.

мое приложение выиграло бы, если бы я мог писать в последовательный порт из основного потока (и никогда не читать из него) и читать из последовательного порта, используя блокировку чтения во втором потоке (и никогда не писать в него). Если кто-то действительно хочет, чтобы я пошел в то, почему это принесет пользу приложению, я могу добавить свои причины. На мой взгляд, будет только один экземпляр Serial (), и даже когда поток B сидит в блокирующем чтении на последовательном объекте, поток A будет безопасно использовать методы записи на последовательном объекте.

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

EDIT: мне кажется, что ответ может зависеть от платформы. Если у вас есть опыт работы с такой платформой, было бы хорошо знать, на какой платформе вы работаете.

EDIT: был только один ответ, но если кто-то еще пробовал это, пожалуйста, оставьте ответ с вашим опытом.

4 ответов


Я сделал это с pyserial. Чтение из одного потока и запись из другого не должны вызывать проблем в целом, поскольку на самом деле нет никакой проблемы арбитража ресурсов. Последовательные порты являются полнодуплексными, поэтому чтение и запись могут происходить совершенно независимо и одновременно.


Я использовал pyserial таким образом в Linux (и Windows), никаких проблем !


Я бы рекомендовал изменить поток B от "блокирующего чтения"до" не блокирующего чтения/записи". Поток B станет вашим последовательным портом "Daemon".

поток A может работать на полной скорости для удобного пользовательского интерфейса или выполнять любую операцию в реальном времени.

поток A будет писать сообщение в поток B вместо того, чтобы пытаться писать непосредственно на последовательный порт. Если размер/частота сообщений низкая, простой общий буфер для самого сообщения и флаг, чтобы указать, что новое сообщение присутствует будет работать. Если вам нужна более высокая производительность, вы должны использовать стек. На самом деле это реализовано просто с использованием массива, достаточно большого, чтобы накопить много сообщений для отправки и два указателя. Указатель записи обновляется только потоком A. указатель чтения обновляется только потоком B.

поток B захватит сообщение и отправит его в последовательный порт. Последовательный порт должен использовать функцию тайм-аута, чтобы функция последовательного порта чтения освобождала процессор, позволяя вы должны опросить общий буфер и, если какое-либо новое сообщение присутствует, отправить его в последовательный порт. Я бы использовал сон в этот момент, чтобы ограничить время процессора, используемое потоком B.. Затем вы можете сделать цикл потока B для функции последовательного порта чтения. Если тайм-аут последовательного порта работает неправильно,например, если кабель USB-RS232 отключен, функция сна будет иметь значение между хорошим кодом Python и не очень хорошим.


Я написал сценарий, который делает это. Смотри:https://code.google.com/p/rpicopter/source/browse/RPiQuadroServer.py