有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java消息、处理程序和线程:Lego Mindstorms蓝牙通信

这个问题涉及到编写一个应用程序,该应用程序与lego mindstorms机器人上的NXT模块进行通信

我想做什么

NXC(不完全是C,一种为NXT编写程序的语言)提供了一个函数until(condition),该函数等待条件计算为true。我想使用蓝牙消息协议实现这一点,从安卓应用程序通过蓝牙与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(适用于蓝牙文档)


共 (1) 个答案

  1. # 1 楼答案

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

    编辑:(很抱歉回复太晚!)

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

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