线路缓冲在哪里发生?在哪个流上?

时间:2016-01-10 22:18:46

标签: android linux bluetooth raspberry-pi

我通过蓝牙在我的智能手机和我的Raspberry Pi之间传输字节。 Pi运行raspbian并且在其GPIO标头上附加了蓝牙串行的东西。在智能手机上,我使用各种Android蓝牙控制台应用程序。

要在Pi中查看手机中的数据,我正在使用的终端:

socat / dev / ttyAMA0 -

这很好用,角色在两个方向都流动,一切正常。

但是 - 当我通过蓝牙将手机应用程序中的字符串发送到Pi时,只有在换行后才会看到Pi终端上的字符串。同样是从Pi->手机回复。所以行缓冲正在进行中。

使用示波器我可以看到我从蓝牙应用程序发送的每个字符都会产生RS232数据,因此在通过电话的方式上没有缓冲。缓冲是在Pi的某个地方,换行正在冲洗它。

有谁可以描述这是哪里? (我熟悉无/行/块缓冲方案 - 只是 where (我认为))

钽 富

---更详细的信息---

因此,要删除Raspberry Pi上本地终端的问题,我编写了最小的Java应用程序,以便使用/dev/ttyAMA0FileInputStream读取字符。字面上等待一个字节,将其打印到控制台(使用println()),然后再次等待read()

在通过蓝牙发送0x0A之前,我没有读取任何字符,此时输出所有先前缓冲的字符。

这会使socat退出循环并需要在那里关闭行缓冲。

行动中似乎仍有行缓冲 - 但它在哪里?

2 个答案:

答案 0 :(得分:0)

来自 socat 的手册页:

  

“...当数据在一侧可用并且可以写入   另一方面,socat读取它,如果执行换行字符转换   必需,并将数据写入。的文件描述符   其他流,然后继续等待两者中的更多数据   方向“。

我猜 socat 写入 stdout 这是行缓冲的,因此您只会在换行符后看到终端上的行。

我从未使用过socat,但似乎有几个选项可以查看/设置文件描述符,例如CW-DCWFD:<fdnum>,请参考man page。我会尝试将其更改为stderr,看看会发生什么。

答案 1 :(得分:0)

好的,所以我终于彻底解决了我的问题,我可以继续我最初的发展道路。

我的治疗方法是发布此TTY设置: stty -F /dev/ttyAMA0 raw

其中raw是其他选项的合并 - 请参阅http://linux.die.net/man/1/stty

组合选项很多,但明显的选项似乎是min 1

所以现在当我使用蓝牙控制台通过蓝牙手机发送角色时,我会在我的Raspberry Pi上运行的Java程序中实时显示这些角色。

我从uart连接的蓝牙产品中读取的java程序正在使用jSSC库。仅这一点对线路缓冲没有帮助。我必须在运行自己的应用程序之前运行stty ... raw

来自我的Java程序的示例:

readBytes() read 1 char 'h value 104 End of readBytes() readBytes() read 1 char 'e value 101 End of readBytes() readBytes() read 3 char 'l value 108 char 'l value 108 char 'o value 111 End of readBytes() readBytes() read 1 char ' value 10 End of readBytes()

最后会看到LF。所有其他&#34;你好&#34;收到的是收到的,而不是收到一个readBytes()和LF。

希望这有助于某人!我不明白为什么这对Pi开发者来说不是一个更常见的问题!