2010-08-18 33 views
11

Tôi đã gặp sự cố với tính toàn vẹn dữ liệu bằng cách sử dụng ổ cắm RFCOMM qua Bluetooth trong Android. Tôi không gặp bất kỳ sự cố nào khi kết nối nhưng dữ liệu tôi nhận được bị cắt xén và không giống như dữ liệu được gửi. Dữ liệu được gửi bởi thiết bị RS232 qua bộ điều hợp Bluetooth, mà điện thoại kết nối với. Không có sự cố với bộ điều hợp vì dữ liệu được nhận đúng cách nếu tôi kết nối với máy tính xách tay.Lỗi Transmisison dữ liệu bằng SPP qua Bluetooth trên Android

Kết nối Bluetooth của tôi được xử lý dựa trên ứng dụng mẫu BluetoothChat được tìm thấy tại trang web dành cho nhà phát triển Android (http://developer.android.com/resources/samples/BluetoothChat/index.html), không có thay đổi. Dữ liệu được gửi là văn bản thuần và các ký tự điều khiển (được xóa bỏ trước khi hiển thị cho người dùng). Vấn đề cụ thể mà tôi có là một số văn bản bị thiếu, một số văn bản được lặp lại, v.v. Điều thú vị là nếu tôi kết nối với máy tính bằng ứng dụng đầu cuối và nhập vào đó, dữ liệu được truyền đi tốt. Ngoài ra, nếu tôi kết nối với thiết bị bằng ứng dụng GetBlue, dữ liệu sẽ được nhận tiền phạt.

Vì vậy, tôi đoán vấn đề là gì GetBlue có thể làm khác để xử lý việc truyền dữ liệu Bluetooth của nó, hoặc có cách nào khác nhận dữ liệu Bluetooth qua ổ cắm RFCOMM trên Android không?

+0

Tôi nghĩ rằng một phần của vấn đề phải làm với luồng, vì chức năng đọc trong luồng nằm trên một chuỗi riêng biệt. Ngoài ra, dữ liệu đang được gửi nhanh chóng. – MortalToaster

Trả lời

9

Sửa chữa giải pháp là tạo chuỗi trong chuỗi được kết nối, trực tiếp sau khi gọi hàm read() trên InputStream và sau đó chuyển chuỗi trở lại chuỗi chính để hiển thị. Vì lý do gì đó, việc truyền mảng byte giữa các luồng đã dẫn đến sự lặp lại đáng kể và mất dữ liệu.

Modified run() mã:

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; 
      } 
     } 
    } 

Và việc tiếp nhận xử lý:

 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

Sự cố với mẫu Trò chuyện Bluetooth trong triển khai ban đầu của nó là nếu nó được sử dụng để nhận các ký tự nhanh hơn tốc độ nhập của con người, bạn sẽ bắt đầu thấy các ký tự bị mất hoặc lặp lại rõ ràng. Lý do cho việc này cực kỳ đơn giản: Mảng byte [] có tham chiếu được truyền đến giao diện người dùng thông qua 'Handler' sẽ sớm được lấp đầy với các ký tự mới hơn từ thao tác' .read() 'tiếp theo. Vì vậy, bạn thực sự cần phải thực hiện một số loại đệm vòng tròn giữa 'Thread' được kết nối và bất cứ điều gì đang xử lý dữ liệu nhận được. – Trevor

+0

@Trevor & @@ MortalToaster, cảm ơn rất nhiều. Đã đấu tranh với nó trong một thời gian dài. –

2

Lỗi này là do các tham chiếu đối tượng được chuyển đến giao diện người dùng, Nếu bạn sao chép các mảng byte (đệm) đến một mảng byte khác nó hoạt động.

Các vấn đề liên quan