gpt4 book ai didi

linux - 蓝牙RFCOMM连接Linux

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

我正在尝试使用蓝牙连接将可穿戴设备连接到处理 IDE。在任何事情之前,我不得不说我已经让它在 Windows 操作系统上运行,但是我在 Linux Mint 上努力做到这一点。试图让它工作我让事情变得更糟,所以我将尝试清楚地解释自己尽可能。

第一个问题

一开始,我能够从处理连接到 rfcomm0 端口,但它只向我发送了包含 255 个内容的字节。例如,如果我发送诸如 myPort.write(0x03) 之类的命令来获取我的可穿戴设备的流媒体样本,它并没有这样做,它只是向我发送了一个 255 的字节。在同一个程序中,但在 Windows 中运行,我得到了我向设备询问的所有数据,所以它必须是 rfcomm0 端口的问题。我的/etc/bluetooth 看起来像这样:

rfcomm0 {
# Automatically bind the device at startup
bind yes;

# Bluetooth address of the device
device 00:06:66:42:10:44;

# RFCOMM channel for the connection
channel 1;

# Description of the connection
comment "Example Bluetooth device";
}

设备已经配对,所以执行 rfcomm bind 0 00:06:66:42:10:44 并以管理员身份运行处理我能够连接到端口(尽管没有像我说的那样收到正确的数据)。我真的是串口新手,但我猜可能是 channel 号 1 不正确。 我如何知道我需要使用哪个 channel ?

第二个问题

尝试修复它,我使用 rfcomm 释放 rfcomm0,更改了 rfcomm0 文件设置 channel 0(以测试不同的 channel )并再次绑定(bind)后(rfcomm bind 0 00:06:66:42:10:44 0, to确保它连接到其他 channel )并运行处理我在尝试连接时不断收到此错误:

Error opening serial port /dev/rfcomm0: Port not found

这个端口的文件确实存在。我已将文件的权限掩码设置为/dev/rfcomm0 to crw-rw-rw- 1 root dialout 216, 0 Apr 30 17:04/dev/rfcomm0 以防出现问题但没有运气。

当我使用命令 rfcomm 时,它会给我这个:

rfcomm0: 00:06:66:42:10:44 channel 0 clean

那么……有什么帮助吗?

最好的问候

编辑

第二个问题仅在我将 rfcomm 连接到 channel0 时出现。所以:

-Channel 0 -> Port not found
-Channel 1 -> Bytes with 255.
-Channel X -> Nothing.

请记住,相同的代码在 Windows 中运行良好。

编辑2

好吧,看来我得到了一些东西......当我从方法 DRAW() 发送消息时,可穿戴设备只向我发送信息字节,但是这种很糟糕,因为我需要从设置方法(发送一个从 draw 方法向 StartStreaming 发送消息没有意义,它会一直发送此消息。

编辑3

这似乎是一些时间问题......如果我在设置功能上这样做:

  for(int i = 0; i < 50; i++){
delay(200);
getSampleRate();
}

我只得到 4-5 次的答案包...我真的不知道发生了什么。

这是完整的代码:

    void setup() 
{
size(windowW, windowH);
smooth();

// List all the available serial ports:
println(Serial.list());

try {
myPort = new Serial(this, Serial.list()[0], 115200);

} catch (Exception e) {

println(e.getMessage());
connectionError = true;
}

delay(2000);

/*
for(int i = 0; i < 50000; i++){
delay(200);
getSampleRate();
}
*/
}

void draw(){

background(255);

}

// Called whenever there is something available to read
void serialEvent(Serial port) {

int bytesAvailable = myPort.available();
for(int i = 0; i < bytesAvailable; i++){
println("Byte:", port.read());
}
}

最终编辑

好吧,经过大量研究和测试后,我认为问题出在 Linux 中使用蓝牙的端口连接上。我在 Windows 和 MAC 中尝试了相同的代码,一切运行良好...

最佳答案

在与/etc/bluetooth 绑定(bind)时,我遇到了类似的问题。

我不知道为什么会这样,但这就是我的工作方式。

我将/etc/bluetooth 留空了。

我在代码中完成了所有连接。

插入 USB 蓝牙后,您需要使用它:

bzero(temp, 256);
sprintf(temp, "sudo hciconfig hci0 reset");
system((char*)temp);

以上只需要在第一次插入 USB 时进行,而不是每次连接时都进行。有时 EMI 会导致 USB“拔出并重新插入”,在这种情况下您需要再次运行上述操作。

这连接到设备:

bzero(temp, 256);
sprinttf(temp, "sudo rfcomm -r connect 00:06:66:42:10:44 1");
system((char*)temp);

然后我用它来检查是否建立了连接:

for(timeout = 0;; timeout++){
access_status = access("/dev/rfcomm1", F_OK);
if(access_status != -1) break; /* file exist */
if(timeout >= 10) {
printf("Failed to connect.");
return;
}
sleep(1);
}

为了关闭连接,我使用了这个:

bzero(temp, 256);
sprintf(temp, "sudo rfcomm release /dev/rfcomm1");
system((char*)temp);

不用说,您需要配置 sudo,因此运行 rfcomm 和 hciconfig 不需要密码。

关于linux - 蓝牙RFCOMM连接Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23393528/

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