İ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;
Tüm veriler alındığında bunu düşünüyor musunuz? Senin açından. – partlov
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
"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