gpt4 book ai didi

c++ - 蓝牙可以接收数据但不能发送数据(C++ socket编程通信Matlab)

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

我正在使用 Raspberry Pi 3 的内部蓝牙,并且正在编写一个 C++ 代码来连接我的 Windows PC 的蓝牙。在 PC 端,我使用 Matlab 并且能够将字节发送到树莓派。但是,当我尝试将字节从树莓派发送到 PC 时,出现以下错误:

“传输端点未连接”

并且 Matlab 显示“读取不成功:指定数量的数据未在超时期限内返回”。

另一件有趣的事情是,当我尝试从 Matlab 发送超过三个字节时,树莓派只接收前三个,就好像其余的不存在一样。如果我连续使用两次读取,我可以获得 6 个字节,依此类推。只是指出这个奇怪的事实,因为我认为它可能与我的主要问题有关并且是一个线索。

我也曾尝试使用菜单栏上的蓝牙符号手动发送文件,但成功了。所以 C++ 代码应该做一些不同的事情来导致这个问题。

我的问题可能是什么原因造成的?如何使用 C++ 将数据从树莓派发送到我的计算机?

我的代码如下:(引用网址:http://people.csail.mit.edu/albert/bluez-intro/index.html)

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>

int main(int argc, char **argv)
{
struct sockaddr_rc loc_addr = { 0 }, rem_addr = { 0 };
char buf[1024] = { 0 };
int s, client, bytes_read;
socklen_t opt = sizeof(rem_addr);

// allocate socket
s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);

bdaddr_t tempBDADDR = {0};
// bind socket to port 1 of the first available
// local bluetooth adapter
loc_addr.rc_family = AF_BLUETOOTH;
loc_addr.rc_bdaddr = tempBDADDR;
loc_addr.rc_channel = (uint8_t) 1;
bind(s, (struct sockaddr *)&loc_addr, sizeof(loc_addr));

// put socket into listening mode
listen(s, 1);

// accept one connection
client = accept(s, (struct sockaddr *)&rem_addr, &opt);

ba2str( &rem_addr.rc_bdaddr, buf );
fprintf(stderr, "accepted connection from %s\n", buf);
memset(buf, 0, sizeof(buf));

// read data from the client
bytes_read = read(client, buf, sizeof(buf));
if( bytes_read > 0 ) {
printf("received [%s]\n", buf);
}

int status = 0;
// send a message
if( status == 0 ) {
status = write(s, "hello!", 6);
}

if( status < 0 ) perror("uh oh");

// close connection
close(client);
close(s);
return 0;
}

Matlab 方面直接如下:

b = Bluetooth('raspberrypi', 1);
fopen(b);
fwrite(b, uint('1234'));
input = fread(b,6)
fclose(b);
clear('b');

编辑:

刚发现当我使用以下行时我没有得到“传输端点未连接”。然而,这只允许我作为客户端连接,而 matlab 只有客户端类型的连接。所以现在,我可以从另一个套接字向我的计算机发送数据而不会出现任何错误,但无法使用 matlab 读取数据。

status = connect(s, (struct sockaddr *)&addr, sizeof(addr));

最佳答案

刚刚想通了。将它留在这里,以防它对其他人也有帮助。

当一个连接被接受时,一个新的描述符被返回(连同一个新的套接字)。这是与 connect() 的显着区别。所以我在下面一行错了。

status = write(s, "hello!", 6);

将其更改为

status = write(client, "hello!", 6);

工作起来很有魅力。

(引用:http://users.pja.edu.pl/~jms/qnx/help/tcpip_4.25_en/prog_guide/sock_advanced_tut.html)

关于c++ - 蓝牙可以接收数据但不能发送数据(C++ socket编程通信Matlab),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37573761/

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