首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用C++从LEGO EV3传感器获取数据?

使用C++从LEGO EV3传感器获取数据?
EN

Stack Overflow用户
提问于 2014-06-16 23:06:05
回答 2查看 3.4K关注 0票数 1

我正在尝试使用C++与乐高头脑风暴EV3砖进行通信。我克隆了ev3sources回购,它允许我通过蓝牙来实现--例如,启动连接到A端口的马达--我们可以这样做:

代码语言:javascript
复制
#include <unistd.h>
#include <fcntl.h>
#include "ev3sources/lms2012/c_com/source/c_com.h"

int main()
{

    // start motor on port A at speed 20
    unsigned const char start_motor[] {12, 0, 0, 0,
        DIRECT_COMMAND_NO_REPLY,
        0, 0,
        opOUTPUT_POWER, LC0(0), LC0(0x01), LC0(20),
        opOUTPUT_START, LC0(0), LC0(0x01)};

    // send above command to EV3 via Bluetooth
    int bt = open("/dev/tty.EV3-SerialPort", O_WRONLY);
    write(bt, start_motor, 14);
    close(bt);
}

但是如何从EV3砖块中获取数据呢?例如,假设我想读取连接到端口1的任何传感器捕获的数据。基于回购实例,我知道我需要这样的东西:

代码语言:javascript
复制
#include <unistd.h>
#include <fcntl.h>
#include "ev3sources/lms2012/c_com/source/c_com.h"

int main()
{

    // read sensor on port 1
    unsigned const char read_sensor[] {11, 0, 0, 0,
        DIRECT_COMMAND_REPLY,
        0, 0,
        opINPUT_READ, LC0(0), LC0(0), LC0(0), LC0(0), GV0(0)};

    // send above command to EV3 via Bluetooth
    int bt = open("/dev/tty.EV3-SerialPort", O_WRONLY);
    write(bt, read_sensor, 13);
    close(bt);
}

但是缺少了一些东西--上面的片段不会返回任何错误,但是我不知道传感器数据在哪里。那我怎么才能找回它?我想它也是通过蓝牙发送回来的,但是我如何捕捉它呢?

(OSX10.9.3,Xcode 5.1.1,EV3 31313)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-17 00:42:22

您需要在编写完之后从bt中读取。与您发送的数据一样,前两个字节是大小,所以先读取2个字节,然后使用它来计算需要读取的字节数。

代码语言:javascript
复制
#define MAX_READ_SIZE 255
unsigned char read_data[MAX_READ_SIZE];
int read_data_size;

// existing code
// ...
write(bt, read_sensor, 13);
read(bt, read_data, 2);
read_size = read_data[0] + read_data[1] << 8;
read(bt, read_data, read_size);
close(bt);
// decode the data
// ...

编辑:基于注释的完整代码

代码语言:javascript
复制
#include <unistd.h>
#include <fcntl.h>
#include "ev3sources/lms2012/c_com/source/c_com.h"

#define MAX_READ_SIZE 255

int main()
{
    unsigned char read_data[MAX_READ_SIZE];
    int read_data_size;

    // read sensor on port 1
    unsigned const char read_sensor[] {11, 0, 0, 0,
        DIRECT_COMMAND_REPLY,
        1, 0, // 1 global variable
        opINPUT_READ, LC0(0), LC0(0), LC0(0), LC0(0), GV0(0)};

    // send above command to EV3 via Bluetooth
    int bt = open("/dev/tty.EV3-SerialPort", O_RDWR);
    write(bt, read_sensor, 13);
    read(bt, read_data, 2);
    read_size = read_data[0] + read_data[1] << 8;
    read(bt, read_data, read_size);
    close(bt);
    // TODO: check that command was successful and so something with data
}
票数 1
EN

Stack Overflow用户

发布于 2016-06-08 11:47:30

也许不完全是你想要的答案,但对于那些发现自己处于同样情况的人来说,这可能是有用的:

作为c4ev3的一部分,我们开源了我们的EV3上传器,它也可以用来向设备发送与连接无关的命令。

查看https://github.com/c4ev3/ev3duder/blob/master/moveEv3.pl以获得一个示例。

这样做的好处是,您的代码不必担心连接方法:连接是否通过蓝牙、Wi或USB实现对您来说是完全透明的。您只需向./ev3duder tunnel打开两个管道并使用这些管道。

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

https://stackoverflow.com/questions/24253509

复制
相关文章

相似问题

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