gpt4 book ai didi

android - 行缓冲发生在哪里?在哪个流上?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:11 26 4
gpt4 key购买 nike

我正在通过蓝牙在智能手机和 Raspberry Pi 之间传输字节。 Pi 运行 raspbian,并在其 GPIO 接头上附加了一个蓝牙串口。在智能手机上,我使用各种安卓蓝牙控制台应用程序。

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

socat/dev/ttyAMA0 -

这工作正常,字符双向流动,一切正常。

但是 - 当我通过蓝牙从手机应用程序向 Pi 发送一个字符串时,只有在换行之后我才能在 Pi 终端上看到该字符串。 Pi->phone 也是如此。所以行缓冲正在进行。

使用示波器,我可以看到我从蓝牙应用程序发送的每个字符都会产生 RS232 数据,因此在从手机传出时没有缓冲。缓冲在 Pi 的某个地方,换行符正在刷新它。

谁能描述一下这是哪里? (我熟悉无/行/ block 缓冲方案 - 只是不是哪里(我认为))

塔丰富

--- 更多详情 ---

因此,为了消除我的 Raspberry Pi 上本地终端的问题,我编写了最小的 Java 应用程序以紧密循环读取来自 /dev/ttyAMA0 的字符。使用 FileInputStream .从字面上等待一个字节,将其打印到控制台(使用 println() )然后等待 read()再次。

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

这需要 socat跳出循环并需要关闭那里的行缓冲。

行缓冲似乎仍在运行 - 但它在哪里?

丰富

最佳答案

好吧,我终于彻底解决了我的问题,可以继续我原来的开发路径。

我的解决办法是发出这个 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() 读取 1
char 'h 值 104
readBytes() 结束
readBytes() 读取 1
字符值 101
readBytes() 结束
readBytes() 读取 3
字符值 108
字符值 108
炭化值 111
readBytes() 结束
readBytes() 读取 1
字符'
值 10
readBytes() 结束

最后会看到 LF。所有其他“hello”都在发送时收到,而不是与 LF 一起在一个 readBytes() 中收到。

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

关于android - 行缓冲发生在哪里?在哪个流上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34711444/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com