1

我正在创建一个 Android 应用程序,它通过蓝牙将我的设备连接到嵌入式芯片。我正在根据 Palm Pilot 上已经存在的程序(用 C 编写)对我的设计进行建模。我正在使用蓝牙聊天示例来运行我的代码,但已经卡住了。我对整个编码世界仍然很陌生,并且让自己有些困惑。

我想将以下代码从 C 转换为 Java....

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

我在这里遇到的唯一真正问题是第三个参数。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];
    ...
}

但这对我来说似乎不对,我觉得我混淆了我对字节的定义。听起来可能很愚蠢,但我对这些信息还不够自信。将 a 转换为 java 让我感到困惑UInt32,因为 java 没有等效类型。如果有人知道,请告诉我。

4

1 回答 1

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 原语。需要注意的是字节顺序和有符号/无符号合并。如果遇到问题,可以使用 << 运算符将字节读入 32 位 int,依次添加每个字节,然后左移 8 位。

在您的情况下,我要做的就是在读取后查看缓冲区中的值,并弄清楚到底发送了什么,由于我上面给出的两个原因,目测流可能很重要。

于 2012-07-23T14:23:50.420 回答