2013-03-14 23 views
5

Tôi đăng bài lần đầu tiên vì vậy tôi hy vọng rằng tôi viết mọi thứ theo định dạng.Vấn đề Java SerialPortEvent: DATA_AVAILABLE cuộc gọi nhanh hơn sau đó dữ liệu đến

Hiện tại tôi đang làm việc trên một dự án sử dụng Giao tiếp nối tiếp với RXTX giữa ứng dụng java và thiết bị đo lường. Điều này làm việc tuyệt vời, nhưng bây giờ tôi muốn nắm bắt các dữ liệu mà thiết bị gửi với các sự kiện.

Mã bên dưới hoạt động nhưng có vấn đề sau: DATA_AVAILABLE sẽ được gọi 4 lần trước khi tất cả dữ liệu sẽ được gửi. Tôi bắt được điều này trong một chuỗi gọi là vBuffer và tôi có thể nắm bắt dữ liệu để nhận được chuỗi đầy đủ.

Bây giờ tôi muốn trả lại dữ liệu này (chuỗi đầy đủ), nhưng không thể tìm thấy SerialPortEvent sẽ đợi cho đến khi tất cả dữ liệu được gửi để trả về chuỗi này.

Trong ví dụ bên dưới, tôi sử dụng OUTPUT_BUFFER_EMPTY nhưng điều này được gọi khi bắt đầu gửi lệnh. Điều này có nghĩa là khi gửi lệnh cho lần thứ 2, sự kiện OUTPUT_BUFFER_EMPTY sẽ trả về vBuffer với dữ liệu từ lệnh đầu tiên và ngay sau khi bắt đầu lệnh thứ 2. Tại thời điểm thứ 3 OUTPUT_BUFFER_EMPTY gửi dữ liệu từ lệnh thứ 2 và bắt đầu số 3, v.v.

Có cách nào để DATA_AVAILABLE đợi cho đến khi tất cả dữ liệu được gửi hay không?

Thông tin bổ sung: Lệnh được gửi với Stringbuilder ký tự để đảm bảo định dạng phù hợp cho thiết bị được gửi. Việc bố trí lệnh như sau: <STX><COMMAND><RTX><CR><LF>. Tôi có thể bắt kịp bằng cách nhìn vào thời điểm lệnh kết thúc? Nếu vậy, làm thế nào?

Cập nhật: Đây là mã làm thế nào tôi gửi một chức năng:.

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()); 

Sau này DATA_AVAILABLE sẽ kick vào Nhưng không đợi cho đến khi tất cả các dữ liệu nhận được thực hiện.

Chỉnh sửa: Để sửa lỗi này, vẫn không tiếp tục xảy ra sự cố.

serialEvent Phương pháp:

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

Bạn nghĩ rằng khi tất cả dữ liệu được nhận? Từ phía bạn. – partlov

+0

Không thực sự biết ý bạn là gì, nhưng Chuỗi tôi nhận được chứa dữ liệu đo lường từ thiết bị được kết nối. Và chuỗi đó tôi sẽ chia. Tôi đã thực hiện điều này theo cách hardcoded (buộc một giấc ngủ), nhưng bây giờ cố gắng để đạt được điều này mà không có phần cứng mã hóa ở giữa. – Skillcoil

+0

"Có cách nào trong DATA_AVAILABLE để chờ cho đến khi tất cả dữ liệu được gửi". Tôi không thấy bạn đang gửi bất cứ điều gì, chỉ nhận được. Bạn có nghĩa là chờ đợi cho đến khi tất cả các dữ liệu được nhận? – partlov

Trả lời

2

Tôi đã tìm thấy một cách để kiểm tra lệnh set STX và ETX quá xem thông điệp là đầy đủ (ETX là vào cuối thông điệp). Nếu điều này kiểm tra sự thật, thì tôi đã có một thông điệp hoàn chỉnh.

Sự cố được giải quyết!

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); 
    } 
} 
Các vấn đề liên quan