c - Linux 串行 IO - 在两个线程之间拆分 Tx 和 Rx?

标签 c linux io embedded polling

在尝试为串行 IO 实现一个应该相当简单的例程时,我遇到了一个精神障碍时刻。

情况是我们有一个嵌入式 linux 板(想想 Pi/Beagle),它使用 standard Linux termios code 与 UART 上的另一个设备通信。 .

问题是我们有两个冲突的要求:

在传输方向,我们要在Linux messaging queue 上阻塞msgrcv() 函数直到消息到达我们发送。

在接收方向,我们需要等待/阻止传入消息(对于规范模式操作,它可以具有终止字符)。

Tx 和 Rx 是异步的并且彼此不相关 - 任何一个都可能希望在任何时候发生。

轮询会很痛苦,因为它会导致 CPU 周期开销和响应延迟。

一种方法是将其分成两个线程,一个处理 Tx 并在 msgrcv() 上阻塞,另一个在规范模式下处理 Rx 并在 UART read() 上阻塞——但这会带来设置的痛苦在 Tx 和 Rx 进程之间建立信号量并且都必须重复打开和关闭串行端口,并且 Rx 线程可能最终不得不轮询信号量以防 Tx 需要控制,让我们回到轮询。

我要强调的是,我对所有这些 Linux 东西都比较陌生,所以我完全准备好向大家展示我在这里缺少的明显的解决方案/方法/调用/操作。

有没有什么方法可以在 UART Rx 上阻塞但仍然能够按需传输?

最佳答案

最后我听从了 Martin James 的建议,做了这样的事情:

fd = open(serial_port);
pthread_create(TxThread, fd);
pthread_create(RxThread, fd);

Linux 似乎对此非常满意,两个线程都可以毫无问题地完成工作。

关于c - Linux 串行 IO - 在两个线程之间拆分 Tx 和 Rx?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20885045/

相关文章:

c# - 确定文件移动的目标是否在 C# 中的同一文件系统上

c - Linux 内核 - kthread_stop 总是返回 -EINTR?

c - 将 *.data 文件读入动态扩展的结构数组***

c - C 函数中的指针

php - Cron 作业在早上 5 点到晚上 10 点之间每 90 秒运行一次 PHP 脚本?

linux - 按bash中的多列排序

linux - Expect 模块中字符串中的字符转义单引号

Java 阻塞 IO - 写操作有什么优势吗?

c++ - 间接运算符和指向数组的指针

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?