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;
Bạn nghĩ rằng khi tất cả dữ liệu được nhận? Từ phía bạn. – partlov
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
"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