0

シリアルポートリスナーがあるサーブレットコンテキストリスナーがあります。このリスナーでは、次の方法でシリアル ポートからのバイトを保存します。

public void contextInitialized(ServletContextEvent contextEvent){
  context = contextEvent.getServletContext();
  serial =  SerialFactory.createInstance();
  serial.open(Serial.DEFAULT_COM_PORT, 19200);
  serial.addListener(new SerialDataListener(){
    @Override
    public void dataReceived(SerialDataEvent arg0) {    
    private byte[] serialDataByte;
    serialDataByte = arg0.getData().getBytes();
    context.setAttribute("serialData", serialDataByte);
    seriale.write(serialDataByte); //the echo on serial port show me the right bytes                                
    }           
  });
}

私のコントローラーでは、次の方法でシリアルポートデータにアクセスします。

private byte[] temp;
temp = (byte[]) getServletContext().getAttribute("serialData");
for(int i=0; i<temp.length;i++){
  output.println(Integer.toHexString(temp[i] & 0x00FF));    
}

このバイト配列をシリアル ポートに送信します。

aa 7f 40 a 72 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 fe 1a

長さは 69 です。一時配列に、元の配列のほんの一部しかない場合もあります。

aa 7f 40 a 72 0 0 0 0 0 0 0 0 0 0

時折:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 fe 1a

そして時には69バイトの正しい配列。シリアルポートから取得した正確なデータをコントローラに渡すにはどうすればよいですか? 前もって感謝します

4

1 に答える 1

1

そのポートにさらにデータが入ってくると、このコードはserialDatacontext 属性で最初に持っていたものを上書きします。したがって、属性が存在する場合にのみ書き込み、最初のdataRecieved()呼び出し後にポートを閉じることを検討してください。

serial.addListener(new SerialDataListener(){
    @Override
    public void dataReceived(SerialDataEvent arg0) {    
        private byte[] serialDataByte;
        if (context.getAttribute("serialData") == null) {
            serialDataByte = arg0.getData().getBytes();
            context.setAttribute("serialData", serialDataByte);
            seriale.write(serialDataByte); // I assume this is only for debugging
                                           // and also supposed to be `serial`
            serial.close();
        }
    }
});
于 2013-02-25T21:08:37.803 に答える