我已经实现了一个可以通过i2c通信与metawear设备通信的应用程序。我现在遇到的问题是,在发送写入命令后,我需要等待一段时间,直到我读取值(大约150ms)。
我遇到的问题是它没有等到那个特定的时间。我使用了TimeUnit,Thread.sleep和wait函数,但仍然没有延迟我希望它执行下一行代码。这是我实现的功能:
module.exports = {
entry: './src/example.js',
output: {
filename: "./dist/example.js",
library: "Example",
libraryTarget: "var"
},
module: {
loaders: [
{
exclude: /(node_modules|bower_components)/,
loader: 'babel',
query: {
presets: ['es2015']
}
}
]
}
};
我希望它在执行 @Override
protected void test_application(){
timerModule.scheduleTask(new Timer.Task() {
@Override
public void commands() {
i2cModule.writeData((byte) 0x34, (byte) 0xA0, new byte[]{(byte) 0x98});
//We need to wait >80ms for the ADC to finish the conversion value
// synchronized (this) {
// try {
// wait(150);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
//}
try{
TimeUnit.MILLISECONDS.sleep(150);
} catch (InterruptedException e){
e.printStackTrace();
}
//try{
// Thread.currentThread().sleep(150);
//} catch (InterruptedException e){
// e.printStackTrace();
//};
//After waiting 150ms for the conversion time, we read the output value through the I2C line
i2cModule.readData((byte)0x34, (byte)0x00, (byte)4).onComplete(new CompletionHandler<byte[]>() {
@Override
public void success(byte[] result) {
auxvar = result;
}
});
finalvoltage = ((auxvar[0]&0x3F)<<18)|(auxvar[1]<<10)|(auxvar[2]<<2)|((auxvar[3]&0xC0));
diff_volt1 = (float)finalvoltage * 3/16777215;
LineData data = chart.getData();
if (startTime == -1) {
data.addXValue("0");
startTime= System.currentTimeMillis();
} else {
data.addXValue(String.format("%.2f", (System.currentTimeMillis() - startTime) / 1000.f));
}
data.addEntry(new Entry(diff_volt1, sampleCount), 0);
sampleCount++;
}
}, 500, false).onComplete(new AsyncOperation.CompletionHandler<Timer.Controller>() {
@Override
public void success(Timer.Controller result) {
result.start();
}
});
函数之前等待。这是来自逻辑分析器的捕获,以便您可以看到它在读取数据之前不会等待
有谁知道如何实现这个或解决这个问题?不管怎样,谢谢。
编辑:我已将写入命令更改为一行,逻辑分析仪的新输出如下:
i2cmodule.readData()
新输出如下:
答案 0 :(得分:0)
通常,如果命令是异步的,则等待命令完成是一个坏主意。在执行.writeData()
方法之前,您需要确保.readData()
方法已完成。
有很多方法可以做到这一点。我喜欢监听器模式,但为此你也可以使用抽象类构造。
基本思想是实现一个类(让我们调用这个DataWriter
),在完成数据写入后立即调用抽象方法。
一个非常基本的例子是:
类定义
abstract class DataWriter {
public DataWriter() {
doWritingFunction();
}
private void doWritingFunction() {
//here you do your writing operation
//when it's done it calls:
onWritingDone();
}
abstract void onWritingDone();
}
然后你像这样实例化你的类:
DataWriter dataWriter = new DataWriter() {
@Override
void onWritingDone() {
//do data read here
}
};
永远不要使用Thread.sleep()等待异步任务完成,因为你永远不知道它什么时候完成