2013-03-14 13 views
5

İlk defa gönderiyorum, umarım herşeyi formata göre yazarım.Java SerialPortEvent sorunu: DATA_AVAILABLE, daha sonra gelen verilere göre daha hızlı aramalar

Şu anda bir java uygulaması ve bir ölçüm aygıtı arasında RXTX ile Serial Communication kullanılarak bir proje üzerinde çalışıyorum. Bu harika çalışıyor, ancak şimdi cihazın olaylarla birlikte gönderdiği verileri yakalamak istiyorum.

Aşağıdaki kod çalışır, ancak aşağıdaki sorunla karşı karşıyadır: DATA_AVAILABLE, tüm veriler gönderilmeden önce 4 kez çağrılır. Bunu vBuffer adlı bir dizede yakalarım ve tüm dizeyi almak için verileri yakalayabiliyorum.

Şimdi bu veriyi (tam dizgi) döndürmek istiyorum, ancak bu dizeyi döndürmek için tüm verilerin gönderilmesini bekleyene kadar bir SerialPortEvent bulamıyorum.

Aşağıdaki örnekte OUTPUT_BUFFER_EMPTY kullanıyorum, ancak bu komut göndermenin başında çağrılmaktadır. Bu, komutu ikinci kez gönderirken, OUTPUT_BUFFER_EMPTY olayının vBuffer'ı ilk komuttan veriyle ve 2. komutu başlattıktan hemen sonra geri döneceği anlamına gelir. 3 zamanda OUTPUT_BUFFER_EMPTY 2 komutundan veri gönderir ve vb 3 başlar

tüm veriler göndermek, ya da tüm veri göndermek sonra adı verilecek başka durum var; kadar beklemek DATA_AVAILABLE bir yolu var mı?

Ek bilgi: Aygıtın doğru biçiminin gönderileceğinden emin olmak için bir komut Stringbuilder chars ile gönderilir. Bir komutun yerleşimi şu şekildedir: <STX><COMMAND><RTX><CR><LF>. Komutun ne zaman bitip bitmeyeceğine bakabilir miyim? Öyleyse nasıl?

Güncelleme: Bu benim bir işlev göndermek nasıl kodudur. Bu DATA_AVAILABLE sonra

StringBuilder message = new StringBuilder(); 
    message.append(new Character((char) 2)); // STX (Start of Text) 
    message.append("M");      // Command character 
    message.append(new Character((char) 3)); // ETX (End of Text 
    message.append(new Character((char) 13)); // CR (Carriage Return) 
    message.append(new Character((char) 10)); // LF (Line Feed) 
    outputStream.write(message.toString().getBytes()); 

yılında başlayacaklarını Ama bütün alınan veri bitmeden beklemez.

Düzenleme: Bu sorunu gidermek için hala sorun değil.

serialEvent Yöntem:

public void serialEvent(SerialPortEvent event) 
{ 
    switch (event.getEventType()) 
    { 
    case SerialPortEvent.BI: 
    case SerialPortEvent.OE: 
    case SerialPortEvent.FE: 
    case SerialPortEvent.PE: 
    case SerialPortEvent.CD: 
    case SerialPortEvent.CTS: 
    case SerialPortEvent.DSR: 
    case SerialPortEvent.RI: 
    case SerialPortEvent.OUTPUT_BUFFER_EMPTY: 
    if (vBuffer != "") 
    { 
     System.out.println(vBuffer); 
    } 
    break; 
    case SerialPortEvent.DATA_AVAILABLE: 
    byte[] readBuffer = new byte[40]; 

    try 
    { 
     while (inputStream.available() > 0) 
     { 
     int numBytes = inputStream.read(readBuffer); 
     } 
     vBuffer += new String(readBuffer); 
     System.out.print(new String(readBuffer)); 
    } 
    catch (IOException e) 
    { 
     System.out.println(e); 
    } 
    break; 
+0

Tüm veriler alındığında bunu düşünüyor musunuz? Senin açından. – partlov

+0

Gerçekten ne anlama geldiğini bilmiyorum, ancak aldığım Dize bağlı cihazdan ölçüm verileri içeriyor. Ve bu dize ayrılacağım. Bunu zor kodlanmış bir şekilde yaptım (bir uykuya zorladım), ama şimdi bunu aralarında kodlanmış parçalar olmadan gerçekleştirmeye çalışıyorum. – Skillcoil

+0

"Tüm verilerin gönderilmesini beklemek için DATA_AVAILABLE bir yol var mı". Hiçbir şey göndermediğini görüyorum, sadece alma. Tüm veriler alınana kadar beklemek mi istiyorsun? – partlov

cevap

2

I (ETX mesajın sonunda ise) komut seti STX kontrol edip mesaj tamamlanıp tamamlanmadığını ETX görmek de bir yolunu buldum. Bu doğruyu kontrol ederse, tam bir mesajım var.

Sorun çözüldü!

public void serialEvent(SerialPortEvent event) 
{ 

if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) 
{ 
    System.out.println("Data available event received"); 

    try 
    { 
    int available = inputStream.available(); 
    byte[] readBuffer = new byte[available]; 

    if (available > 0) 
    { 
     inputStream.read(readBuffer); 
    } 

    messageBuffer = messageBuffer + new String(readBuffer); 

    try 
    { 
     int start = messageBuffer.indexOf(new Character((char) 2)); 
     int end = messageBuffer.indexOf(new Character((char) 10)); 

     if (start >= 0 && end >= 0) 
     { 
     System.out.println("We found 1 complete message!!"); 
     System.out.println(messageBuffer.substring(start, end)); 
     _fireBufferEvent(); 
     messageBuffer = ""; 
     } 
    } 
    catch (IndexOutOfBoundsException ex) 
    { 
     System.out.println("IndexOutOfBoundsException, message not complete yet. Waiting for more data."); 
    } 
    } 
    catch (IOException ex) 
    { 
    System.out.println("IOException while reading data:"); 
    System.out.println(ex); 
    } 
}