如何将数据从USB设备发送到DJI SDK?

问题描述 投票:0回答:3

所以这可能是一个问题的基础,但我在硬件方面没有太多经验。我正在使用DJI Android Mobile SDK与M600飞行控制器进行通信,并且我正在试图来回发送信息的FTDI CU / TTY设备。

这成功地将“Hello World”发送到我的USB设备:

//sends data to onboard sdk device
final byte[] helloWorld = "HelloWorld".getBytes();
mFlightController.sendDataToOnboardSDKDevice(helloWorld, new CommonCallbacks.CompletionCallback() {
    @Override
    public void onResult(DJIError djiError) {
        if (djiError != null) {
            showToast(djiError.getDescription());
            WriteFileAppendAsync writeAppend = new WriteFileAppendAsync();
            writeAppend.execute(djiError.getDescription(), "sendOnboardErrorFile.txt");
        } else {
            showToast("Hopefully Hello World");
            WriteFileAppendAsync writeAppend = new WriteFileAppendAsync();
            writeAppend.execute(helloWorld.toString(), "sendOnboardSuccessFile.txt");
        }
    }
});

当我在终端中运行以下任一项时,我可以看到这个:

screen /dev/cu.usbserial-BLAHBLAH 38400
screen /dev/tty.usbserial-BLAHBLAH 38400

出现一堆乱码/象形文字,然后每次点击触发上述DJI代码的按钮时弹出“Hello World”文本。

现在,我希望得到这个工作的翻转方面,即使用以下内容从USB发送回DJI sdk:

if (mFlightController.isOnboardSDKDeviceAvailable()) {
    showToast("Set Onboard SDk Callback");
    mFlightController.setOnboardSDKDeviceDataCallback(new FlightController.OnboardSDKDeviceDataCallback() {
        @Override
        public void onReceive(byte[] bytes) {
            WriteFileAppendAsync writeAppend = new WriteFileAppendAsync();
            writeAppend.execute(bytes.toString(), "onboardCallbackFile.txt");
        }
    });
}

麻烦的是我似乎永远不会得到任何回应。

根据this question,我确保我已经读取了USB设备的写入权限:

chmod o+rw /dev/ttyS1

我已经尝试了各种echo和cat命令(我不知道哪一个是读写的)。他们要么说设备忙,要么就是说,他们似乎打开了一个通信端口(终端无限期地闪烁),但没有任何东西发送到我的设备。

我试过的命令:

echo 'HelloTest' > /dev/cu.usbserial-BLAHBLAH

没有什么特别的事情发生,进入下一个终点线

echo 'HelloTest' > /dev/tty.usbserial-BLAHBLAH

终端返回HelloTest

echo 'HelloTest' < /dev/tty.usbserial-BLAHBLAH

光标无限期地闪烁

echo 'HelloTest' < /dev/cu.usbserial-BLAHBLAH

终端返回HelloTest

cat < /dev/cu.usbserial-BLAHBLAH
cat -v < /dev/tty.usbserial-BLAHBLAH
cat -v > /dev/tty.usbserial-BLAHBLAH
cat -v > /dev/cu.usbserial-BLAHBLAH

没有这样的文件或目录(我想我需要为此运行2个终端?)

问题

这与波特率有关吗?我在DJI助手中设置了这个。 TTY和CU以及Echo和Cat有什么区别?我尝试了各种各样的组合。我可以使用cu和tty的screen命令。最后,什么是一个简单的hello world我可以发送回sdk,看看我实际上是从usb设备接收数据?我认为回声会成功,但我没有收到任何东西。

编辑

我几乎觉得我需要使用像usb-serial-for-android这样的东西;但是,我实际上并没有将USB设备连接到我的Android设备。相反,我连接到DJI RC控制器,它连接到Lightbridge / M600,它通过API端口与我的USB设备连接。

serial-port usb dji-sdk usbserial
3个回答
1
投票

我相信您需要了解DJI OpenProtocol才能实现这一目标。事实上,“一堆胡言乱语”是问题所在。这种胡言乱语是DJI无人机用来正确传递通信的协议。

要使用最新代码从“Onboard”发送到“Mobile”,您需要将0xFE CMD_Set Id作为数据的标头:

https://developer.dji.com/onboard-sdk/documentation/protocol-doc/open-protocol.html

因此,要么找出适合您数据的格式,要么购买便宜的PC并安装OSDK。


0
投票

我曾经使用带有ROS onboardSDK的Matrice M100来回避这个问题。

if (mFlightController.isOnboardSDKDeviceAvailable()) {
    showToast("Set Onboard SDk Callback");
    mFlightController.setOnboardSDKDeviceDataCallback(new FlightController.OnboardSDKDeviceDataCallback() {
        @Override
        public void onReceive(byte[] bytes) {
            WriteFileAppendAsync writeAppend = new WriteFileAppendAsync();
            writeAppend.execute(bytes.toString(), "onboardCallbackFile.txt");
        }
    });
}

你在哪里叫这个?这就是我解决问题的方法:我写了一个函数:

private void addCallback()
{
        mFlightController.setOnboardSDKDeviceDataCallback(new 
         FlightController.OnboardSDKDeviceDataCallback() {
            @Override
            public void onReceive(byte[] bytes) {
                // Do stuff with the data here..
            }
        });
}

然后在我的onResume方法中我做了类似的事情:

@Override
    public void onResume() {
        Log.e(TAG, "onResume");

        super.onResume();
        if (mFlightController != null) {
            addCallback();
        }
    }

这不是最优雅的方式,但它似乎对我有用。你可以找到我的解决方案here。我工作已经有一段时间了!


0
投票

如果您有FTDI设备,那么您需要一个FTDI驱动程序。 :)

你偶然安装了这样的东西吗? https://www.ftdichip.com/FTDrivers.htm

通过USB进行串口仿真需要虚拟串口软件才能运行。

© www.soinside.com 2019 - 2024. All rights reserved.