首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EV3上的蓝牙

EV3上的蓝牙
EN

Stack Overflow用户
提问于 2019-10-10 05:27:58
回答 1查看 121关注 0票数 2

在我开始之前。是的,我可以使用leJOS、ev3dev或其他一些工具,但我喜欢这样做,因为这是我学习的方式。

我使用的是CodeSourcery arm-2009q1 arm工具链。我从这里获取了所需的库(蓝牙):https://github.com/mindboards/ev3sources。我正在使用这个工具上传程序到砖块上:https://github.com/c4ev3/ev3duder

我还获取了砖块的共享库,但我无法使它们正常工作,并且没有关于如何使用共享库为ev3编写c程序的文档。如果我能让它工作,我也许可以使用c_com模块来处理蓝牙,但现在bluez和rfcomm与:https://github.com/c4ev3/EV3-API一起用于电机和传感器控制似乎是我最好的选择。

现在,我想把EV3作为蓝牙“服务器”运行,这意味着我在它上面启动一个程序,程序打开一个套接字,绑定它,侦听连接,然后接受一个连接。我可以打开一个套接字,将它绑定到通道1以外的任何东西上(我相信这可能是我问题的症结所在),我能够倾听。这些都返回0 (OK),一切正常。

然后我试着接受一个连接。这会立即返回-1并将遥控器设置为地址00:00:00:00:00:00。

我的代码与可以在这里找到的代码基本相同:https://people.csail.mit.edu/albert/bluez-intro/x502.html

这就是它:

代码语言:javascript
复制
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>
#include <ev3.h>

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

    sock = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);

    loc_addr.rc_family = AF_BLUETOOTH;
    loc_addr.rc_bdaddr = *BDADDR_ANY;
    loc_addr.rc_channel = 2; // <-- Anything but 1. 1 seems to be taken
    bind(sock, (struct sockaddr *)&loc_addr, sizeof(loc_addr));

    listen(sock, 1);

    // accept one connection <-- PROGRAM FAILS HERE AS accept() returns -1
    client = accept(sock, (struct sockaddr *)&rem_addr, &opt);

    // ---- All following code is irrelevant because accept fails ----

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

    bytes_read = read(client, buf, sizeof(buf));
    if( bytes_read > 0 )
        printf("received [%s]\n", buf);

    close(client);
    close(sock);

    FreeEV3();
    return 0;
}

我能够让相同的代码在我的pi上工作。甚至在特定于ev3api的函数被注释掉时来回通信。我就是不明白为什么它不能在EV3上工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-10 22:10:48

我想通了。在我的raspberry PI上,accept调用按预期工作,没有任何异常。然而,在EV3上,accept调用是非阻塞的,即使它没有被告知这样做。解决方案是将accept调用放在一个循环中,直到队列中有传入的连接。

代码语言:javascript
复制
while (errno == EAGAIN && ButtonIsUp(BTNEXIT) && client < 0)
    client = accept(sock, (struct sockaddr*)&rem_addr, sizeof(rem_addr));

我会把代码上传到github。如果你想用EV3做一些类似的事情,请联系我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58312564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档