使用c++从乐高EV3传感器获取数据

using C++ to get data from a LEGO EV3 sensor?

本文关键字:传感器 获取 数据 EV3 乐高 c++ 使用      更新时间:2023-10-16

我正试图使用c++与乐高Mindstorms EV3砖进行通信。我克隆了ev3sources repo,它允许我通过蓝牙做到这一点-例如,启动连接到端口A的电机,我们可以这样做:

#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的任何传感器捕获的数据。根据回购的例子,我知道我需要一些看起来像这样的东西:

#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);
}

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

(Xcode 5.1.1, OS X 10.9.3 EV3 [31313])

您需要在写入后从bt读取。像你发送的数据一样,前两个字节是大小,所以先读2个字节,然后用它来计算你还需要读多少字节。

#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
// ...
编辑:基于注释的完整代码
#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
}

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

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

查看https://github.com/c4ev3/ev3duder/blob/master/moveEv3.pl获取示例。

这样做的好处是,你的代码不必担心连接方法:无论连接是通过蓝牙,Wi-Fi还是USB实现的,对你来说是完全透明的。你只要打开两个通往./ev3duder tunnel的管道,然后使用它们。