- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Raspberry Pi 3B 和一个 CRIUS All in One Pro (v2.0) MultiWii 飞行 Controller 。我正在使用 MultiWii 2.4 版本和最新的 NOOBS。我能够很好地设置两者,现在我尝试让 Raspberry Pi 通过连接两 block 板的 USB/Micro USB 电缆与 MultiWii 进行通信。
目前,MultiWii 没有返回任何数据,我不知道为什么。据我所知,我的协议(protocol)是正确的。我查看了几个工作代码存储库(用 Python 或 Java 为 Arduino 编写),并遵循了 MultiWii documentation并通读相关的 forum post .
这是我编写的客户端代码。
package com.jmace.MaceDrone.msp;
import com.pi4j.io.serial.Baud;
import com.pi4j.io.serial.DataBits;
import com.pi4j.io.serial.FlowControl;
import com.pi4j.io.serial.Parity;
import com.pi4j.io.serial.Serial;
import com.pi4j.io.serial.SerialConfig;
import com.pi4j.io.serial.SerialDataEvent;
import com.pi4j.io.serial.SerialDataEventListener;
import com.pi4j.io.serial.SerialFactory;
import com.pi4j.io.serial.StopBits;
import java.io.IOException;
import java.math.BigInteger;
public class MultiWiiClient {
private final Serial serial;
//The preamble is defined by the protocol.
//Every message must begin with the characters $M
private static final String PREAMBLE = "$M";
//Character that denotes information being passed to the MultiWii
private static final char TO_MUTLIWII = '<';
//Character that denotes information being requested from by the MultiWii
private static final char FROM_MUTLIWII = '>';
public MultiWiiClient(String usbPort) {
SerialConfig config = new SerialConfig();
config.device(usbPort)
.baud(Baud._115200)
.dataBits(DataBits._8)
.parity(Parity.NONE)
.stopBits(StopBits._1)
.flowControl(FlowControl.NONE);
this.serial = SerialFactory.createInstance();
serial.addListener(new SerialDataEventListener() {
@Override
public void dataReceived(SerialDataEvent event) {
try {
System.out.println("[HEX DATA] " + event.getHexByteString());
System.out.println("[ASCII DATA] " + event.getAsciiString());
} catch (IOException e) {
e.printStackTrace();
}
}
});
try {
this.serial.open(config);
} catch (Exception e) {
e.printStackTrace();
}
}
public String sendRequest(MultiWiiRequest request) throws IllegalStateException, IOException {
String message = createMessage(request.getId(), false, null);
//////////////////////////////////////////////////////////////////////////////////
System.out.println(message);
System.out.println(String.format("%040x", new BigInteger(1, message.getBytes())));
//////////////////////////////////////////////////////////////////////////////////
return sendMessage(message);
}
public String sendCommand(MultiWiiCommand command, String payload) throws IllegalStateException, IOException {
String message = createMessage(command.getId(), true, payload);
return sendMessage(message);
}
/**
* This method creates the message that will be sent to the MultiWii
*
* Message format is as follows:
* +--------+---------+----+-------+----+---+
* |preamble|direction|size|command|data|crc|
* +--------+---------+----+-------+----+---+
*
* Preamble (2 bytes):
* Marks the start of a new message; always "$M"
*
* Direction (1 byte):
* Either '<' for a command going to the MultiWii or '>' for
* information being requested from the MultiWii
*
* Size (1 byte):
* The number of bytes in the payload
*
* Command (1 byte):
* The message ID of the command, as defined in the protocol
* 100's for requesting data, and 200's for requesting an action
*
* Data (variable bytes):
* The data to pass along with the command
*
* CRC (1 byte):
* Calculated with an XOR of the size, command, and each byte of data
*/
private String createMessage(int mutliWiiCommandnumber, boolean isCommand, String payload) {
StringBuilder message = new StringBuilder(PREAMBLE);
byte checksum=0;
//Get the direction of the message
if (isCommand) {
message.append(TO_MUTLIWII);
} else {
message.append(FROM_MUTLIWII);
}
int datalength = (payload != null) ? payload.length() : 0;
message.append((char) datalength);
checksum ^= datalength;
message.append((char) mutliWiiCommandnumber);
checksum ^= ((int) mutliWiiCommandnumber);
if (payload != null) {
for (char c : payload.toCharArray()){
message.append(c);
checksum ^= (int) c;
}
}
message.append((char) checksum);
return message.toString();
}
private String sendMessage(String message) throws IllegalStateException, IOException {
serial.write(message.getBytes());
serial.flush();
System.out.println("TESTING ------------------");
return "";
}
}
我正在使用“/dev/ttyUSB0”进行连接,我确认这是正确的位置并且它似乎正在工作(运行时没有错误;如果我开始运行然后断开 USB,它会抛出异常,因为它失去了连接)。
运行时,我得到以下输出(发送命令 100,MSP_IDENT):
$M>dd
00000000000000000000000000244d3e006464
TESTING ------------------
参见my Git repo了解更多代码上下文。
编辑:修复了我帖子中的校验和代码
最佳答案
我发现问题出在我的方向上。我认为“<”用于发送命令,“>”用于请求数据。事实证明,在这两种情况下,都应该使用“<”。仅当 MultiWii 响应时才使用“>”字符。
关于java - Raspberry Pi 从 MultiWii 获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39314070/
初学者 android 问题。好的,我已经成功写入文件。例如。 //获取文件名 String filename = getResources().getString(R.string.filename
我已经将相同的图像保存到/data/data/mypackage/img/中,现在我想显示这个全屏,我曾尝试使用 ACTION_VIEW 来显示 android 标准程序,但它不是从/data/dat
我正在使用Xcode 9,Swift 4。 我正在尝试使用以下代码从URL在ImageView中显示图像: func getImageFromUrl(sourceUrl: String) -> UII
我的 Ubuntu 安装 genymotion 有问题。主要是我无法调试我的数据库,因为通过 eclipse 中的 DBMS 和 shell 中的 adb 我无法查看/data/文件夹的内容。没有显示
我正在尝试用 PHP 发布一些 JSON 数据。但是出了点问题。 这是我的 html -- {% for x in sets %}
我观察到两种方法的结果不同。为什么是这样?我知道 lm 上发生了什么,但无法弄清楚 tslm 上发生了什么。 > library(forecast) > set.seed(2) > tts lm(t
我不确定为什么会这样!我有一个由 spring data elasticsearch 和 spring data jpa 使用的类,但是当我尝试运行我的应用程序时出现错误。 Error creatin
在 this vega 图表,如果我下载并转换 flare-dependencies.json使用以下 jq 到 csv命令, jq -r '(map(keys) | add | unique) as
我正在提交一个项目,我必须在其中创建一个带有表的 mysql 数据库。一切都在我这边进行,所以我只想检查如何将我所有的压缩文件发送给使用不同计算机的人。基本上,我如何为另一台计算机创建我的数据库文件,
我有一个应用程序可以将文本文件写入内部存储。我想仔细看看我的电脑。 我运行了 Toast.makeText 来显示路径,它说:/数据/数据/我的包 但是当我转到 Android Studio 的 An
我喜欢使用 Genymotion 模拟器以如此出色的速度加载 Android。它有非常好的速度,但仍然有一些不稳定的性能。 如何从 Eclipse 中的文件资源管理器访问 Genymotion 模拟器
我需要更改 Silverlight 中文本框的格式。数据通过 MVVM 绑定(bind)。 例如,有一个 int 属性,我将 1 添加到 setter 中的值并调用 OnPropertyChanged
我想向 Youtube Data API 提出请求,但我不需要访问任何用户信息。我只想浏览公共(public)视频并根据搜索词显示视频。 我可以在未经授权的情况下这样做吗? 最佳答案 YouTube
我已经设置了一个 Twilio 应用程序,我想向人们发送更新,但我不想回复单个文本。我只是想让他们在有问题时打电话。我一切正常,但我想在发送文本时显示传入文本,以确保我不会错过任何问题。我正在使用 p
我有一个带有表单的网站(目前它是纯 HTML,但我们正在切换到 JQuery)。流程是这样的: 接受用户的输入 --- 5 个整数 通过 REST 调用网络服务 在服务器端运行一些计算...并生成一个
假设我们有一个名为 configuration.js 的文件,当我们查看内部时,我们会看到: 'use strict'; var profile = { "project": "%Projec
这部分是对 Previous Question 的扩展我的: 我现在可以从我的 CI Controller 成功返回 JSON 数据,它返回: {"results":[{"id":"1","Sourc
有什么有效的方法可以删除 ios 中 CBL 的所有文档存储?我对此有疑问,或者,如果有人知道如何从本质上使该应用程序像刚刚安装一样,那也会非常有帮助。我们正在努力确保我们的注销实际上将应用程序设置为
我有一个 Rails 应用程序,它与其他 Rails 应用程序通信以进行数据插入。我使用 jQuery $.post 方法进行数据插入。对于插入,我的其他 Rails 应用程序显示 200 OK。但在
我正在为服务于发布请求的 API 调用运行单元测试。我正在传递请求正文,并且必须将响应作为帐户数据返回。但我只收到断言错误 注意:数据是从 Azure 中获取的 spec.js const accou
我是一名优秀的程序员,十分优秀!