【问题标题】:Serial communication in Linux user space (non blocking)Linux 用户空间中的串行通信(非阻塞)
【发布时间】:2014-06-25 00:19:36
【问题描述】:

我正在尝试使用 UART 让 arduino 板与运行 Ubuntu 的 beaglebone (BB) white 进行通信。我读过BB uart驱动程序已经是中断驱动的。

我想将所有传入数据存储到一种缓冲区中,我可以在需要时读取该缓冲区,类似于在微控制器中完成的方式。但是我试图避免内核编程,所以我将无法使用驱动程序的数据结构。我正在寻找一个完整的用户空间解决方案。

我打算使用两个 python 进程,一个将所有传入数据写入(到共享列表),另一个根据需要读取它,以便读取是非阻塞的。

我有两个问题:

  1. 这是正确的方法吗?如果是,请建议一个简单的进程间通信方法就足够了。

  2. 实现这一点的正确方法是什么?

注意:我使用的是 PyBBIO 库,它直接读写 /dev/mem 特殊文件。

【问题讨论】:

  • 你的问题有点含糊。明确地说,您是想在已经有 Linux 操作系统的 Beaglebone 上开发 RS-232 串行端口通信?如果是这样,那么您需要意识到内核中有一个串行端口驱动程序,并且您必须在用户空间中执行您的应用程序。内核将缓冲程序和驱动程序之间的所有输入和输出。 “写入所有传入数据” 是矛盾的;你的意思是“存储传入的数据”?。
  • 抱歉给您带来了困惑...是的,我正在尝试在 BB 上设置 RS 232 串行端口通信,并且我知道已经有一个中断驱动的 UART 驱动程序。
  • 我本质上需要的是一种以非阻塞方式读取内核缓冲区的机制。我能想到的解决方案之一是用户空间缓冲区(或堆栈/列表类型的数据结构),它镜像驱动程序的缓冲区,我可以读取(通过弹出或使用索引)。我想知道这种方法是否正确?如果是的话,怎么用python实现呢?
  • 再次抱歉,我发现我可以使用 NONBLOCK 参数打开 /dev/mem 文件(在没有数据可读取时处理异常)并直接使用 mmap() 访问 UART 寄存器。所以不需要用户空间缓冲区。
  • “我可以打开 /dev/mem 文件......并直接访问 UART 寄存器。” -- 你试图绕过操作系统,它意味着您不妨摆脱 Linux 并转而使用裸机。当您拥有像 Linux 这样的安全操作系统时,您不应该尝试“类似于在微控制器中完成的方式”,因为这种方式很少结构化且不可移植。您甚至可能不需要非阻塞读取,因为多线程或 select() 可用。 其实你的问题好像是XY问题。.

标签: python linux serial-port multiprocessing beagleboneblack


【解决方案1】:

您可能想使用pyserial,它使用内核接口(我不知道 PyBBIO 是做什么的)。它提供自动输入缓冲——因此您不需要额外的过程。如果您确实想要更多进程,请使用multiprocessing。一个更简单的替代方案是threading,它可以为您节省通信部分。对于具有网络支持的多处理,请使用Ipython's cluster

【讨论】:

  • 谢谢!我正在查看 pyserial API。
猜你喜欢
  • 2014-11-17
  • 2012-05-10
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多