dfl*_*str 9 linux newline serial-port bluetooth
我通过以下命令在Linux上运行蓝牙RFCOMM服务:
sdptool add --channel 1 SP
rfcomm watch hci0 1 "$COMMAND" {}
# ^ here
Run Code Online (Sandbox Code Playgroud)
在$COMMAND
将二进制数据写入作为参数传递的文件.我通过执行以下操作测试了它的行为:
FIFO=$(tempfile)
mkfifo "$FIFO"
"$COMMAND" "$FIFO" &
cat "$FIFO" | hexdump -C # <- output is correct
Run Code Online (Sandbox Code Playgroud)
然而,通过SPP/RFCOMM发现(UUID从不同的装置连接到服务时00001101-0000-1000-8000-00805F9B34FB
),我看到的每个实例0x0A
(LF
)被替换为0x0D
0x0A
(CR
LF
)中的流.问题不在接收端,因为我尝试连接到也发送二进制数据的硬件串行设备,并且转换不会发生.它必须是# ^ here
执行替换的第一个片段(在行上方)中的命令.
为什么该rfcomm
工具会进行此替换,如何禁用它?
看起来你被TTY的线路规则所困扰(请记住,rfcomm
不会创建一个fifo,而是tty).
您可以尝试将TTY更改为原始模式,即没有任何魔法.最简单的方法是stty --file <tty> raw
.我不知道是否rfcomm
会在其命令行中接受几个命令,但您可以轻松地使用脚本:
#!/bin/bash
stty --file "$1" raw
"$COMMAND" "$1"
Run Code Online (Sandbox Code Playgroud)
然后运行:
sdptool add --channel 1 SP
rfcomm watch hci0 1 ./command_raw {}
Run Code Online (Sandbox Code Playgroud)
如果您要运行命令的源,您也可以在C中轻松更改它:
#include <termios.h>
#include <unistd.h>
//WARNING: error checking left as an exercise to the reader!
void make_raw(int fd)
{
struct termios ios;
//Not a TTY: nothing to do
if (!isatty(fd))
return;
tcgetattr(fd, &ios);
cfmakeraw(&ios);
tcsetattr(fd, TCSANOW, &ios);
}
Run Code Online (Sandbox Code Playgroud)