2010-08-18 17 views
11

Android'de Bluetooth üzerinden bir RFCOMM yuvası kullanarak veri bütünlüğü sorunu yaşadım. Bağlanmakta herhangi bir sorunum yok, ancak aldığım veriler, gönderilen verilerle aynı değil. Veriler, telefonun bağlandığı bir Bluetooth adaptörü üzerinden bir RS232 cihazı tarafından gönderilir. Bir dizüstü bilgisayara bağlanırsam veri doğru şekilde alındığından adaptörde bir sorun yok.Veri Transmisison hatası, Bluetooth üzerinden SPP'yi kullanarak Android'de

Bluetooth bağlantım hiçbir değişiklik yapılmadan Android geliştirici sitesinde (http://developer.android.com/resources/samples/BluetoothChat/index.html) bulunan BluetoothChat örnek uygulamasına göre işleniyor. Gönderilen veriler düz metin ve kontrol karakterleridir (bunlar kullanıcıya gösterilmeden önce çıkarılır). Benim sahip olduğum özel sorun, bazı metin eksik, bazı tekrarlanır, vb. Komik bir şey bir terminal uygulaması ile bir bilgisayara bağlanır ve orada yazın, veri ince iletilir. Ayrıca, GetBlue uygulamasını kullanarak cihaza bağlanırsam, veriler iyi alınır.

Yani, sorunun sebebi, GetBlue'nun Bluetooth veri aktarımını işlemek için ne kadar farklı olduğunu ya da Android'de bir RFCOMM soketi üzerinden Bluetooth verilerini almanın başka bir yolu var mı?

+0

Akışta okuyan işlevin ayrı bir iş parçacığı olduğu için, sorunun parçası iş parçacığı ile ilgili olduğunu düşünüyorum. Ayrıca, veriler hızlı bir şekilde gönderiliyor. – MortalToaster

cevap

9

Çözümün düzeltmesi, InputStream öğesindeki read() öğesinin çağrılmasından hemen sonra ve ardından dizgeyi tekrar görüntülemek üzere ana dizgeye geçirdikten sonra, bağlanan iş parçacığı dizesini oluşturmaktı. Herhangi bir nedenden ötürü, bayt dizisini iş parçacıkları arasında geçirme, önemli bir tekrarlama ve veri kaybına yol açmıştır.

Modifiye çalışma() kodu:

public void run() { 
     byte[] buffer = new byte[256]; // buffer store for the stream 
     int bytes; // bytes returned from read() 

     // Keep listening to the InputStream until an exception occurs 
     while (true) { 
      try { 
       // Read from the InputStream 
       bytes = mmInStream.read(buffer); 
       String readMessage = new String(buffer, 0, bytes); 
       // Send the obtained bytes to the UI Activity 
       mHandler.obtainMessage(MESSAGE_READ, bytes, -1, readMessage) 
         .sendToTarget(); 
      } catch (IOException e) { 
       break; 
      } 
     } 
    } 

Ve işleyici alımı:

 case MESSAGE_READ: 
      // Read in string from message, display to mainText for user 
      String readMessage = (String) msg.obj; 
      if (msg.arg1 > 0) { 
       mainText.append(readMessage); 
      } 
+7

Orijinal uygulamasında Bluetooth Sohbet örneğindeki sorun, insan yazma hızından daha hızlı bir karakter almak için kullanılırsa, karakterlerin kaybolduğunu veya görünüşte tekrarlanmaya başladığını göreceksiniz. Bunun sebebi son derece basittir: Referansı UI'ye "Handler" aracılığıyla iletilen byte [] dizisi, sonraki '.read()' işleminden daha yeni karakterlerle doludur. Bu nedenle, bağlı 'Thread' ile alınan verileri işleyen her şey arasında bir çeşit dairesel tampon uygulamanız gerekir. – Trevor

+0

@Trevor & @@ MortalToaster, çok teşekkürler. Bir süredir bununla uğraşıyordum. –

2

nesne referansı, UI geçirilir, çünkü bu hatadır Eğer (tampon bayt dizisi kopyalarsanız) başka bir bayt dizisine çalışır.

İlgili konular