我正在使用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));
答案 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)