Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了linux – 通过蓝牙/ RFCOMM / SPP发送二进制数据将0x0A转换为0x0D 0x0A大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我@R_429_6749@在 Linux上运行蓝牙RFCOMM服务: sdptool add --chAnnel 1 SP rfcomm watch hci0 1 "$COMMAND" {} # ^ here $COMMAND将二进制数据写入作为参数传递的文件.我通过以下方式测试了它的行为是否正确: FIFO=$(tempfilE) mkfifo "$FIFO" "$COMMAND" "$FIFO" & ca
我@R_429_6749@在 Linux上运行蓝牙RFCOMM服务:
sdptool add --chAnnel 1 SP
rfcomm watch hci0 1 "$COMMAND" {}
# ^ here

$COMMAND将二进制数据写入作为参数传递的文件.我通过以下方式测试了它的行为是否正确:

FIFO=$(tempfilE)
mkfifo "$FIFO"
"$COMMAND" "$FIFO" &
cat "$FIFO" | hexdump -C # <- output is correct

但是,当通过SPP / RFCOMM发现(UUID 00001101-0000-1000-8000-00805F9B34FB)从其他设备连接到服务时,我看到0x0A(LF)的每个实例都被0x0D 0x0A(CR LF)替换为流.问题不在接收端,因为我尝试连接到也发送二进制数据的硬件串行设备,并且转换不会发生.它必须是执行替换的第@L_616_2@片段(在#^ here行上方)中的命令.

为什么rfcomm工具执行此替换以及如何禁用它?

解决方法

看起来你被TTY的线路规则所困扰(请记住,rfcomm不会创建@L_616_2@fifo,而是@L_616_2@tty).

您可以尝试将TTY更改为原始模式,即没有任何魔法.最简单的方法是使用stty –file< tty>生的.我不知道rfcomm是否会在其命令行中接受多个命令,但您可以轻松地使用脚本:

command_raw

#!/bin/bash
stty --file "$1" raw
"$COMMAND" "$1"

然后运行:

sdptool add --chAnnel 1 SP
rfcomm watch hci0 1 ./command_raw {}

如果您有要运行的命令的源,您也可以在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);
 }

大佬总结

以上是大佬教程为你收集整理的linux – 通过蓝牙/ RFCOMM / SPP发送二进制数据将0x0A转换为0x0D 0x0A全部内容,希望文章能够帮你解决linux – 通过蓝牙/ RFCOMM / SPP发送二进制数据将0x0A转换为0x0D 0x0A所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。