我试过谷歌搜索,找不到答案,在这里搜索,找不到答案。有没有人研究从线程a写入Serial()对象(pyserial)是否是线程安全并从线程b中阻塞读取?
我知道如何使用线程同步原语和线程安全的数据结构,事实上我这个程序的当前形式有一个专用于读取/写入串口的线程,我使用线程安全的数据结构来协调活动在应用程序中。
如果我可以从主线程写入串口(并且从不读取它),我的应用程序将受益匪浅,并使用第二个线程中的阻塞读取从串行端口读取(并且永远不会写入它)。如果有人真的希望我进入为什么这会使应用程序受益,我可以添加我的理由。在我看来,只有一个Serial()实例,即使线程B位于Serial对象的阻塞读取中,线程A也可以安全地在Serial对象上使用write方法。
任何人都知道Serial类是否可以这样使用?
编辑:我觉得答案可能是平台依赖的。如果您对此类平台有任何经验,最好知道您正在使用哪个平台。 编辑:只有一个回复,但如果有其他人尝试过这个,请根据您的经验留下回复。答案 0 :(得分:11)
我用pyserial完成了这个。从一个线程读取并从另一个线程写入不应该引起一般问题,因为实际上没有任何类型的资源仲裁问题。串行端口是全双工的,因此读写可以完全独立地同时进行。
答案 1 :(得分:3)
我在Linux(和Windows)上以这种方式使用了pyserial,没问题!
答案 2 :(得分:0)
我建议将线程B从“阻塞读取”修改为“非阻塞读/写”。线程B将成为您的串口“守护进程”。
线程A可以全速运行以获得友好的用户界面或执行任何实时操作。
线程A会向线程B写入消息,而不是尝试直接写入串行端口。如果消息的大小/频率很低,则消息本身的简单共享缓冲区和指示新消息存在的标志将起作用。如果您需要更高的性能,则应使用堆栈。实际上,这实际上只是使用一个足够大的数组来累积许多要发送的消息和两个指针。写指针仅由线程A更新。读指针仅由线程B更新。
线程B将获取消息并将其发送到串行端口。串行端口应使用超时功能,以便读取串行端口功能释放CPU,允许您轮询共享缓冲区,如果存在任何新消息,则将其发送到串行端口。我会在此时使用休眠来限制线程B使用的CPU时间。然后,您可以使线程B循环到读取串行端口功能。如果串口超时不能正常工作,就像USB-RS232电缆被拔掉一样,睡眠功能会使好的Python代码与不太好的代码区别开来。
答案 3 :(得分:0)
我写了一个正在执行此操作的脚本。 请参阅:https://code.google.com/p/rpicopter/source/browse/RPiQuadroServer.py