1

COM ポート経由で AT コマンドを送信しようとしていますが、同じコマンドしか受信できません。

package SerialConnections;

import jssc.SerialPort;
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener;
import jssc.SerialPortException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import static ru.telemetria.qa.utils.Utilities.waitTime;

public class M234Serial {
    private static Logger log = LoggerFactory.getLogger(M234Serial.class);
    private SerialPort serialPort;
    private byte[] receivedData;
    private boolean isReceived;

    public M234Serial() throws Exception {

        serialPort = new SerialPort("COM55");
    }

    public void sendCommand() throws Exception {
        open();

        String command = "AT^SCFG?";
        serialPort.writeBytes(command.getBytes());
        log.debug("Send request: " + command);

        while (!isReceived) {}

        close();
    }

    private void open() throws Exception {
        serialPort.openPort();
        serialPort.setParams(SerialPort.BAUDRATE_115200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
        serialPort.addEventListener(new SerialPortEventListener() {
            @Override
            public void serialEvent(SerialPortEvent serialPortEvent) {
                try {
                    waitTime(System.currentTimeMillis(), 2000);
                    receivedData = serialPort.readBytes();
                    log.debug("Received message: " + StringUtils.asciiToString(receivedData));
                    isReceived = true;
                    serialPort.removeEventListener();
                } catch (SerialPortException spe) {
                    spe.printStackTrace();
                }
            }
        });
    }

    private void close() throws Exception {
        serialPort.closePort();
    }

    public static void main(String[] args) throws Exception {
        log.debug("Create instance..");
        M234Serial serial = new M234Serial();
        serial.sendCommand();
        log.debug("End");
    }
}

ログ:

16:19:21.910 [main] DEBUG SerialConnections.M234Serial - インスタンスの作成..

16:19:21.974 [メイン] DEBUG SerialConnections.M234Serial -送信要求: AT^SCFG?

16:19:23.976 [EventThread COM55] DEBUG SerialConnections.M234Serial - 受信メッセージ: AT^SCFG?

16:19:23.977 [メイン] DEBUG SerialConnections.M234Serial - 終了

私は何を間違っていますか?どうすれば修正できますか?

4

2 に答える 2

0

コードに次の改善を提案します。

  • waitTime(System.currentTimeMillis(), 2000);イベントリスナーを次のように置き換えますif ( serialPortEvent.isRXCHAR() ) { ...
  • AT コマンドを適切に終了してください。通常、各コマンド文字列の最後には改行またはキャリッジ リターンが必要です。デバイスのドキュメントを確認してください。
  • volatileにしisReceived ます。つまりprivate volatile boolean isReceived;、異なるスレッド間で共有する場合です。

ビジー待機を回避するには、次のように標準の Java 同期プリミティブを使用できます。

private volatile boolean isReceived;

private final Object syncObject = new Object();

// ...

private void waitForReceived() {
  synchronized(syncObject) {
    while( !isReceived ) {
      syncObject.wait();
    }
  }
}


private void signalReceived() {
  synchronized(syncObject) {
    isReceived = true;
    syncObject.notifyAll();
  }
} 
于 2015-07-28T13:54:12.083 に答える