蓝牙可以接收数据但不能传输它(用C ++进行套接字编程来交流Matlab)

时间:2016-06-01 16:07:30

标签: c++ linux matlab sockets bluetooth

我正在使用Raspberry Pi 3的内部蓝牙,我正在编写一个c ++代码来连接我的Windows PC的蓝牙。在PC端,我使用Matlab,我能够向raspberry发送字节。但是,当我尝试从raspberry发送字节到PC时,我收到以下错误:

“传输端点未连接”

和Matlab说“读取失败:在超时期限内未返回指定数量的数据”。

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

我还尝试手动发送文件,使用菜单栏上的蓝牙符号,它有效。所以c ++代码应该做一些不同的事情来解决这个问题。

可能是我的问题的原因是什么?如何使用c ++将数据从raspberry发送到我的计算机?

我的代码如下: (推荐网站: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));

1 个答案:

答案 0 :(得分:0)

刚想通了。离开这里,以防它也帮助其他人。

当接受连接时,将返回新的描述符(以及新的套接字)。这与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