2012-07-23 58 views
1

我正在創建一個Android應用程序,通過藍牙將我的設備連接到嵌入式芯片。我在Palm Pilot上已經存在的一個程序(使用C編寫)之後對我的設計進行了建模。我正在使用藍牙聊天示例來讓我的代碼運行,並且已經卡住了。我對整個編碼世界仍然很陌生,並且對自己有些困惑。通過I/O流接收一定數量的字節

我想下面的代碼由C轉換成Java ....

SrmReceive(portId,&c,1,(t*5L*Sec)/1000L,&err) 

我在這裏的唯一真正的問題,是第三個參數。如palm手冊中所述,1代表number of bytes to receive,其類型爲UInt32

從藍牙聊天例子中的代碼具有下列功能在數據讀取...

  public void run() { 
       Log.i(TAG, "BEGIN mConnectedThread"); 
       buffer = new byte[1024]; 
       int bytes; 

       // Keep listening to the InputStream while connected 
       while(true) { 
       try { 
        // Read from the InputStream 
        bytes = mmInStream.read(buffer); 

        // Send the obtained bytes to the UI Activity 
        mHandler.obtainMessage(BtHelperHandler.MessageType.READ, bytes, buffer).sendToTarget(); 
       } catch (IOException e) { 
        Log.e(TAG, "disconnected", e); 
        sendErrorMessage(1); 
        break; 
       } 
      } 
     } 

我想改變run()方法有一定的數量要讀取的字節的參數。我對於該怎麼做有些困惑。我在想......

public void run(int size) { 
    buffer = new byte[size]; 
    ... 
} 

但是,這似乎並沒有我的權利,我覺得我混合了我的一個字節的定義。可能聽起來很愚蠢,但我對這些信息還不夠信心。將UInt32轉換爲java是令人困惑的,因爲java沒有相同的類型。如果有人知道,請讓我知道。

回答

2

沒有理由被混淆,你在做什麼是正確的。假設mmInStreamInputStream的一個實例;

byte[] buffer = new byte[1024]; 
int bytes = mmInStream.read(buffer); 

將讀取任何可用的內容,最多爲1024個字節,並返回其讀取的很多字節。這是數據流的低級方法,這很好,它只是意味着你必須知道如何處理這個字節數組。

如果你正在讀原語很多,你可能想看看DataInputStream所,用它像這樣;

DataInputStream dat = new DataInputStream(mmInStream); 
int x = dat.readInt(); 

將從您的流中讀取32位數據(4個字節),並將它們排列成一個java int原語。值得注意的是,endianness,和簽署/無符號的合併。如果遇到問題,使用運算符將​​字節讀入32位int,然後依次添加每個字節,然後左移8位。

在你的情況,我會做的就是看看該值緩衝在讀取後,並弄清楚到底正在發送的,目測流可能是由於兩方面的原因,我給重要以上。