假设我必须连续写入10次串口。
for (int i = 1; i <= 10; i++) {
serialPort.writeInt(i);
// wait until SerialPortEventListener receives something then write again
}
或:
void writeMoreDate(){
serialPort.writeInt(something);
// wait until SerialPortEventListener receives something then write again
serialPort.writeInt(something;
// wait until SerialPortEventListener receives something then write again
serialPort.writeInt(something);
}
我有一个串行端口事件监听器,每当我写入内容时都会触发,并调用 .map()方法。
@Override
public void serialEvent(SerialPortEvent event) {
if (event.isRXCHAR() && event.getEventValue() > 0) {
//when data arrived do something and notify that next method can execute!
}
}
如何使方法等到serialEvent收到某些内容?
- 这是我直到现在使用 java.util.concurrent.Semaphore 处理这个问题的方法:
前:
Semaphore semaphore = new Semaphore(MAX_CONCURRENT_THREADS, true);
void writeMoreDate(){
Runnable runnable () -> {
serialPort.writeInt(something);
semaphore.acquire();
serialPort.writeInt(something;
semaphore.acquire();
serialPort.writeInt(something);
semaphore.acquire();
}
new Thread(runnable).start();
}
和串行侦听器:
@Override
public void serialEvent(SerialPortEvent event) {
if (event.isRXCHAR() && event.getEventValue() > 0) {
semaphore.release();
}
}
但我不确定这是否是正确的解决方案。感谢。
答案 0 :(得分:0)
我会尝试更多地递归而不是使用for循环。有点像:
private int activeIndex = -1;
private int maxIndex = -1;
private void write(int currentIndex, int maxIndex){
if(maxIndex < currentIndex)
return;
activeIndex = currentIndex;
maxIndex = maxIndex;
serialPort.writeInt(currentIndex);
}
然后在您的事件监听器中,您将在最后一个事件结束后触发下一个写入事件...
public void serialEvent(SerialPortEvent event) {
if (event.isRXCHAR() && event.getEventValue() > 0) {
.....
write(activeIndex + 1, maxIndex);
}
}
如果你能以某种方式通过SerialPortEvent传递当前/最大索引而不是使用类变量来保存数据,那将会更加清晰,但我不熟悉这些类以了解是否可能。
因此,从您的示例中,您可以将其用于:
write(0, 10);