通过蓝牙与 LEGO NXT 通信(C#)






4.65/5 (12投票s)
展示如何使用 C# 通过蓝牙与 Lego Mindstorms NXT 机器人通信。

引言
我希望用 C# 编写的程序来远程控制我的 Lego Mindstorms NXT 机器人。由于在 Google 上几乎找不到有用的信息,我决定编写自己的程序来了解 Lego 使用的协议是如何工作的。
我编写的程序(见上图)仅用于实验目的。它允许检索 NXT 版本、NXT 名称,读取邮箱内容,并将数据写入 NXT 邮箱。所有发送到 NXT 和从 NXT 发送的数据都以十六进制显示。
Using the Code
要使用该程序,您必须首先知道您的 PC 使用哪个 COM 端口通过蓝牙与 NXT 砖块通信。最好的方法是打开蓝牙控制面板,并查看与 NXT 砖块关联的服务。

一旦知道了 COM 端口,请选择它并按下“连接”按钮。如果一切顺利,并且您获得了 COM 端口的访问权限,则所有其他按钮都会变为活动状态。否则,程序将崩溃。接下来要做的是尝试通信。向 NXT 发送的最简单的命令是“获取版本”。这在 NXT 砖块上运行任何程序时都有效。
为了尝试邮箱通信,我编写了一个 Lego Mindstorm 程序, mailboxTest.rbt,它将从 input mailbox1
接收到的数字增加一后写入 output mailbox1
。这使我可以测试进出邮箱的通信。

请注意,要写入 PC(即主设备),NXT 必须使用通信通道 ZERO
。
关注点
通过蓝牙与 NXT 通信
提示 1:我确认了许多其他人报告的内容:与 Lego NXT 的蓝牙通信对所使用的蓝牙驱动程序非常敏感。大多数情况下,强烈建议不要安装 - 或者如果已经安装,卸载 - 蓝牙适配器制造商提供的驱动程序,而是使用 Microsoft 蓝牙默认驱动程序。
提示 2:只要 Lego Mindstorms NXT 开发环境正在运行,如果它被配置为通过蓝牙将程序下载到 NXT 砖块,则不允许任何其他程序通过蓝牙访问 NXT 砖块。这就是为什么我总是更喜欢通过 USB 下载 NXT 程序,以便我的应用程序可以使用蓝牙通道。
通过蓝牙发送消息
通过蓝牙与 NXT 砖块的通信非常容易。它是一个简单的 COM 端口,最棒的是您只需要打开 COM 端口;不需要波特率或奇偶校验设置。 .NET 2.0 Framework 提供了一个有用的类, system.io.ports.serialport
,它完全处理 COM 端口。您所要做的就是选择一个 COM 端口,打开该端口,然后读取或写入字节。
SerialPort BluetoothConnection= new SerialPort();
BluetoothConnection.PortName = "COM7";
// Replace this COM port by the appropriate one on your computer
BluetoothConnection.Open();
BluetoothConnection.ReadTimeout = 1500;
BluetoothConnection.Write(Command, 0, Command.Length);
for(int i=0;i<ReplyLength ;i++)
{
textBox2.Text+=BluetoothConnection.ReadByte().ToString("X2");
}
BluetoothConnection.Close();
理解协议
由于 PC 是主设备,因此每次通信都将从 PC 的请求开始,然后由 NXT 砖块的回复结束。每条消息都以 2 个字节开头,给出消息长度(警告:先发送最低有效字节)。由于我的消息总是短于 256 个字节,因此我将最高有效字节设置为零。
发送消息
// Declare a 2 bytes vector to store the message length header
Byte[] MessageLength= {0x00, 0x00};
//set the LSB to the length of the message
MessageLength[0]=(byte)Command.Length;
//send the 2 bytes header
BluetoothConnection.Write(MessageLength, 0, MessageLength.Length);
// send the message itself
BluetoothConnection.Write(Command, 0, Command.Length);
检索回复
// retrieve the reply length
int length =
BluetoothConnection.ReadByte() + 256 * BluetoothConnection.ReadByte();
// retrieve the reply data
for(int i=0;i<length ;i++)
{
textBox2.Text+=BluetoothConnection.ReadByte().ToString("X2")+" ";
}
NXT 砖块的命令示例
注意:所有这些命令都必须以 2 字节的标头为前缀,该标头指示命令长度,如上所述。
获取版本
Byte 2: 0x01
Byte 3: 0x88
此非常简单的命令返回 NXT 版本。这对于检查 PC 与 NXT 砖块之间的通信是否正常运行很有用。
获取信息
Byte 2: 0x01
Byte 3: 0x9B
此命令与“获取版本”命令非常相似,但它提供了其他信息,例如 NXT 名称。
读取邮箱
Byte 2: 0x00
Byte 3: 0x13
Byte 4: Mailbox number+9 (e.g. for mailbox 1 use 0x0A)
Byte 5: 0x00
Byte 6: 0x01 you can use 0x00 instead to leave the byte in the mailbox
NXT 对此命令的回复是邮箱内容,如果邮箱为空,则为错误消息。
在邮箱中写入布尔值
Byte 2: 0x00
Byte 3: 0x09
Byte 4: Mailbox number -1 (e.g. for mailbox 1 use Ox00
Byte 5: 0x02 (this is the datalength: 1 byte + a 1 byte terminator)
Byte 6: The Data to write (either 0X00 or 0X01)
Byte 7: 0x00 (terminator)
NXT 对此命令的回复是“确定”或错误消息,例如,如果没有 NXT 程序正在运行。
在邮箱中写入 32 位整数
Byte 2: 0x00
Byte 3: 0x09
Byte 4: Mailbox number -1 (e.g. for mailbox 1 use Ox00
Byte 5: 0x05 (this is the datalength: 1 byte + a 1 byte terminator)
Byte 6: Data byte 0 (the LSB)
Byte 7: Data byte 1
Byte 8: Data byte 2
Byte 9: Data byte 3 (the MSB)
Byte 10: 0x00 (terminator)
NXT 对此命令的回复是“确定”或错误消息,例如,如果没有 NXT 程序正在运行。
资源
通过蓝牙与 Lego NXT 通信所需的所有信息,包括完整的命令列表,都可以在 Lego 网站的蓝牙开发者套件 (BDK) 文档中找到。
历史
- NXTBlueToothTester v0.2:2007 年 5 月 19 日