java - 消息、处理程序和线程 : Lego Mindstorms bluetooth communication

标签 java android concurrency lego-mindstorms

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

我想做什么

NXC(不完全是 C,一种用于为 NXT 编写程序的语言)提供了一个函数 until(condition),它等待直到 condition 的计算结果为真。我想使用蓝牙消息传递协议(protocol)来实现这一点,通过安卓应用程序中的蓝牙与 NXT 对话。

到目前为止我能做什么:

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

问题是什么:

我正在使用 lego 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 (对于蓝牙文档)

最佳答案

已解决,使用回调 :) 如果需要,很乐意详细说明。

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

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

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

关于java - 消息、处理程序和线程 : Lego Mindstorms bluetooth communication,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11883396/

相关文章:

sql - Derby中带有WHERE子句的SQL UPDATE语句的原子性

java - Camel 没有捕捉到异常

java - 加法和减法

android - 如何在 manifest.json 中指定图标?

android - float 操作按钮未显示 - viewpager

c# - 基于参数锁定

java - 如何使用 codehaus.jackson 获取 POJOS 列表的 JSON 数组表示形式

java - 我们如何合并两个视频,其中一个是水平分辨率,另一个是垂直分辨率,而不使用 ffmpeg 拉伸(stretch)它?

android - 在 fragment 内部进行权限检查后,RecyclerView 不会在首次启动时加载数据

java - 我什么时候应该在 LinkedBlockingQueue 上使用 SynchronousQueue