2

这个问题是指编写一个与乐高头脑风暴机器人上的 NXT 块通信的应用程序。

我想做的事

NXC(不完全是 C,一种用于为 NXT 编写程序的语言)提供了一个函数,该函数until(condition)等待条件评估为真。我想使用蓝牙消息协议来实现这一点,通过蓝牙从 android 应用程序与 NXT 交谈。

到目前为止我能做的:

我能够发送一个输入查询消息 ( getInputValue(int in)),它向 NXT 发送一条消息,询问输入的当前状态。然后,NXT 会发回一条包含此信息的消息,然后将其写入保存最近询问的输入值的全局变量(我们称之为myValue)。

问题是什么:

我正在使用乐高 MINDroid 应用程序中的点点滴滴——在这个类中,我有一个单独的通信线程来处理与 NXT 的直接通信。当它收到一条消息时,它会通过Handler. 当我尝试忙于等待回复时会出现问题 - 执行以下操作:

while(myValue != valueIWant) {
  sleep(100);
  getInputValue(in);
}

最终忙于主线程,因此处理程序实际上永远不会收到任何消息。通信线程从 NXT 接收消息,将它们转发到主线程,但处理程序永远不会被调用,因为它正在做其他事情。

解决这个问题的最佳方法是什么?我不能让线程以任何方式等待,因为这也会阻止它接收消息:(

任何建议,将不胜感激!我也很乐意详细说明任何代码。

可能有用的链接

http://bricxcc.sourceforge.net/nbc/nxcdoc/nxcapi/main.html

http://github.com/NXT/LEGO-MINDSTORMS-MINDdroid

http://mindstorms.lego.com/en-us/support/files/default.aspx(用于蓝牙文档)

4

1 回答 1

1

解决,使用回调:) 如果需要,很高兴详细说明。

编辑:(抱歉回复晚了!)

我最终实现了一个回调过程,我将一个“回调”函数附加到某个列表。当处理程序接收到消息时,它将查看回调列表并查看接收到的消息是否与存在的任何回调函数匹配 - 如果是,它将执行回调中的方法。

然后我围绕这些回调创建了一个类,我可以在其中创建执行队列 (doA; doB; doC;) 并将它们包装成一个回调链 (callBack({doA; callBack({doB; call...}) })),这给人的印象是我在同步环境中运行,而实际上它是在异步运行的。

于 2012-08-09T16:06:34.693 回答