0

假设我必须连续写入 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();
        } 
    }

但我不确定这是否是正确的解决方案。谢谢。

4

1 回答 1

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);
于 2016-08-12T15:44:39.623 回答