所以这可能是一个问题的基础,但我在硬件方面没有太多经验。我正在使用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设备连接。
我相信您需要了解DJI OpenProtocol才能实现这一目标。事实上,“一堆胡言乱语”是问题所在。这种胡言乱语是DJI无人机用来正确传递通信的协议。
要使用最新代码从“Onboard”发送到“Mobile”,您需要将0xFE CMD_Set Id作为数据的标头:
https://developer.dji.com/onboard-sdk/documentation/protocol-doc/open-protocol.html
因此,要么找出适合您数据的格式,要么购买便宜的PC并安装OSDK。
我曾经使用带有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。我工作已经有一段时间了!
如果您有FTDI设备,那么您需要一个FTDI驱动程序。 :)
你偶然安装了这样的东西吗? https://www.ftdichip.com/FTDrivers.htm
通过USB进行串口仿真需要虚拟串口软件才能运行。