2012-01-09 69 views
6

我试着用谷歌搜索这个,找不到答案,在这里搜索,找不到答案。有没有人研究过从线程a写入Serial()对象(pyserial)是否线程安全,并阻止从线程b读取数据?pyserial - 可能从线程写入串行端口a,阻塞读取线程b?

我知道如何使用线程同步原语和线程安全的数据结构,实际上我目前的这个程序的形式有一个专用于读/写串口的线程,我使用线程安全的数据结构来协调在应用程序中的活动。

如果我可以从主线程写入串行端口(并且从不读取),并且使用第二个线程中的阻塞读取(并且从不写入)从串行端口读取,我的应用将受益匪浅。如果有人真的希望我进入为什么这将有利于应用程序,我可以添加我的理由。在我看来,只有一个Serial()实例,即使线程B位于Serial对象的阻塞读取中,线程A在Serial对象上使用写入方法也是安全的。

有人知道串口类是否可以这样使用?

编辑:它发生在我身上,答案可能是平台相关的。如果你对这样的平台有任何经验,那么很高兴知道你正在从事哪个平台。

编辑:只有一个响应,但如果任何人已经尝试过这一点,请留下您的经验回应。

回答

11

我已经用pyserial完成了这项工作。从一个线程读取并从另一个线程写入不应该导致一般问题,因为没有真正的资源仲裁问题。串行端口是全双工的,因此读写可以在同一时间独立完成。

+0

您是否使用PySerial?并在哪些平台上成功运行? – 2012-01-10 18:35:16

+0

我在Windows上使用PySerial,但无法想象它为什么不能在任何平台上工作。 – TJD 2012-01-10 18:42:52

+0

感谢您分享您的体验! – 2012-01-11 01:32:02

3

我已经在Linux(和Windows)上以这种方式使用了pyserial,没有问题!

0

我建议将线程B从“阻塞读取”修改为“非阻塞读取/写入”。线程B将成为您的串口“守护进程”。

线程A可以全速运行友好的用户界面或执行任何实时操作。

线程A会向线程B写入消息,而不是直接写入串行端口。如果消息的大小/频率较低,则消息本身的简单共享缓冲区和用于指示新消息存在的标志将会起作用。如果你需要更高的性能,你应该使用堆栈。这实际上是使用一个足够大的数组来实现的,这个数组足够积累许多要发送的消息和两个指针。写指针仅由线程A更新。读指针仅由线程B更新。

线程B将获取消息并将其发送到串行端口。串行端口应使用超时功能,以便读取串行端口功能释放CPU,从而允许轮询共享缓冲区,并且如果存在任何新消息,则将其发送到串行端口。我将在此时使用睡眠来限制线程B使用的CPU时间。然后,可以使线程B循环到读取串行端口函数。如果串口超时工作不正常,就像拔掉USB-RS232电缆一样,睡眠功能会在好的Python代码和不太好的代码之间做出区别。

+4

双线程方法的重点在于您不需要在任何地方进行轮询,因为读线程只会阻止rcv。 – mikepurvis 2013-04-10 14:34:43