我通过蓝牙在我的智能手机和我的Raspberry Pi之间传输字节。 Pi运行raspbian并且在其GPIO标头上附加了蓝牙串行的东西。在智能手机上,我使用各种Android蓝牙控制台应用程序。
要在Pi中查看手机中的数据,我正在使用的终端:
socat / dev / ttyAMA0 -
这很好用,角色在两个方向都流动,一切正常。
但是 - 当我通过蓝牙将手机应用程序中的字符串发送到Pi时,只有在换行后才会看到Pi终端上的字符串。同样是从Pi->手机回复。所以行缓冲正在进行中。
使用示波器我可以看到我从蓝牙应用程序发送的每个字符都会产生RS232数据,因此在通过电话的方式上没有缓冲。缓冲是在Pi的某个地方,换行正在冲洗它。
有谁可以描述这是哪里? (我熟悉无/行/块缓冲方案 - 只是 where (我认为))
钽 富
---更详细的信息---
因此,要删除Raspberry Pi上本地终端的问题,我编写了最小的Java应用程序,以便使用/dev/ttyAMA0
从FileInputStream
读取字符。字面上等待一个字节,将其打印到控制台(使用println()
),然后再次等待read()
。
在通过蓝牙发送0x0A之前,我没有读取任何字符,此时输出所有先前缓冲的字符。
这会使socat
退出循环并需要在那里关闭行缓冲。
行动中似乎仍有行缓冲 - 但它在哪里?
富
答案 0 :(得分:0)
来自 socat 的手册页:
“...当数据在一侧可用并且可以写入 另一方面,socat读取它,如果执行换行字符转换 必需,并将数据写入。的文件描述符 其他流,然后继续等待两者中的更多数据 方向“。
我猜 socat 写入 stdout 这是行缓冲的,因此您只会在换行符后看到终端上的行。
我从未使用过socat,但似乎有几个选项可以查看/设置文件描述符,例如CW-D
和CWFD:<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开发者来说不是一个更常见的问题!