Java 浮动指针
Java float pointer
我正在尝试获取串行数据并将其转换为 Float
。
数据从 MCU 传递到 FTDI 芯片和我的 android 设备。
当我得到 0xbf700000
(-0.9375),0x3dbc01a3
(0.0918),0x3e9f9724
(0.3117) 的值时,我的 java 代码将其更改为 float
但不是float
应该是,它获取每个字节并更改它,而不是 float 应该是 4 个字节。
代码:
package com.application.i;
import jp.ksksue.driver.serial.FTDriver;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.hardware.usb.UsbManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class FTDI extends Activity{
// [FTDriver] Object
FTDriver mSerial;
// [FTDriver] Permission String
private static final String ACTION_USB_PERMISSION =
"jp.ksksue.tutorial.USB_PERMISSION";
Button btnRead;
TextView Monitor;
TextView indicator;
StringBuffer mText = new StringBuffer();
StringBuffer Data = new StringBuffer();
String places=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ftdisub);
btnRead = (Button) findViewById(R.id.btnRead);
Monitor = (TextView)findViewById(R.id.onitor);
indicator = (TextView)findViewById(R.id.indicator);
// [FTDriver] Create Instance
mSerial = new FTDriver((UsbManager)getSystemService(Context.USB_SERVICE));
// [FTDriver] setPermissionIntent() before begin()
PendingIntent permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(
ACTION_USB_PERMISSION), 0);
mSerial.setPermissionIntent(permissionIntent);
// [FTDriver] Open USB Serial
if(mSerial.begin(FTDriver.BAUD115200)) {
btnRead.setEnabled(true);
Toast.makeText(this, "connected", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "cannot connect", Toast.LENGTH_SHORT).show();
}
}
// @Override
// public boolean onCreateOptionsMenu(Menu menu) {
// getMenuInflater().inflate(R.menu.ftdisub, menu);
// return true;
// }
//
@Override
public void onDestroy() {
super.onDestroy();
// [FTDriver] Close USB Serial
mSerial.end();
}
public void onReadClick(View view) {
int i,len;
// [FTDriver] Create Read Buffer
byte[] rbuf = new byte[12]; // 1byte <--slow-- [Transfer Speed] --fast--> 4096 byte
// [FTDriver] Read from USB Serial
len = mSerial.read(rbuf);
for(i=0; i<len; i++) {
if ((char) rbuf[i] == 0x23){
Data.append((int) i+1);
Data.append((char) 0x23);
}
mText.append((float)rbuf[i]);
}
mText.append((char) 0x2c);
indicator.setText(Data);
Monitor.setText(mText);
}
}
输出:
在 C 编码中,我将使用一个浮点指针,这个指针有 4 个字节长,这将使一个成功的十六进制浮点。
我的问题是如何在 Java 上使用类似 C 的等效浮点指针?
Java中没有浮点指针这样的东西。您在方法定义中使用的内容 - 它告诉 Java 如何处理提供的引用 - 您可以将其视为指针。 Java 假设在这个特定地址的数据将被 Java 解释为浮点数。
当你使用不同的处理器时你应该考虑的另一点 - Endianness - 我不确定你的处理器使用什么但你必须确定并仔细检查它是大端还是小端 -两边字节序。
我正在尝试获取串行数据并将其转换为 Float
。
数据从 MCU 传递到 FTDI 芯片和我的 android 设备。
当我得到 0xbf700000
(-0.9375),0x3dbc01a3
(0.0918),0x3e9f9724
(0.3117) 的值时,我的 java 代码将其更改为 float
但不是float
应该是,它获取每个字节并更改它,而不是 float 应该是 4 个字节。
代码:
package com.application.i;
import jp.ksksue.driver.serial.FTDriver;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.hardware.usb.UsbManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class FTDI extends Activity{
// [FTDriver] Object
FTDriver mSerial;
// [FTDriver] Permission String
private static final String ACTION_USB_PERMISSION =
"jp.ksksue.tutorial.USB_PERMISSION";
Button btnRead;
TextView Monitor;
TextView indicator;
StringBuffer mText = new StringBuffer();
StringBuffer Data = new StringBuffer();
String places=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ftdisub);
btnRead = (Button) findViewById(R.id.btnRead);
Monitor = (TextView)findViewById(R.id.onitor);
indicator = (TextView)findViewById(R.id.indicator);
// [FTDriver] Create Instance
mSerial = new FTDriver((UsbManager)getSystemService(Context.USB_SERVICE));
// [FTDriver] setPermissionIntent() before begin()
PendingIntent permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(
ACTION_USB_PERMISSION), 0);
mSerial.setPermissionIntent(permissionIntent);
// [FTDriver] Open USB Serial
if(mSerial.begin(FTDriver.BAUD115200)) {
btnRead.setEnabled(true);
Toast.makeText(this, "connected", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "cannot connect", Toast.LENGTH_SHORT).show();
}
}
// @Override
// public boolean onCreateOptionsMenu(Menu menu) {
// getMenuInflater().inflate(R.menu.ftdisub, menu);
// return true;
// }
//
@Override
public void onDestroy() {
super.onDestroy();
// [FTDriver] Close USB Serial
mSerial.end();
}
public void onReadClick(View view) {
int i,len;
// [FTDriver] Create Read Buffer
byte[] rbuf = new byte[12]; // 1byte <--slow-- [Transfer Speed] --fast--> 4096 byte
// [FTDriver] Read from USB Serial
len = mSerial.read(rbuf);
for(i=0; i<len; i++) {
if ((char) rbuf[i] == 0x23){
Data.append((int) i+1);
Data.append((char) 0x23);
}
mText.append((float)rbuf[i]);
}
mText.append((char) 0x2c);
indicator.setText(Data);
Monitor.setText(mText);
}
}
输出:
在 C 编码中,我将使用一个浮点指针,这个指针有 4 个字节长,这将使一个成功的十六进制浮点。 我的问题是如何在 Java 上使用类似 C 的等效浮点指针?
Java中没有浮点指针这样的东西。您在方法定义中使用的内容 - 它告诉 Java 如何处理提供的引用 - 您可以将其视为指针。 Java 假设在这个特定地址的数据将被 Java 解释为浮点数。
当你使用不同的处理器时你应该考虑的另一点 - Endianness - 我不确定你的处理器使用什么但你必须确定并仔细检查它是大端还是小端 -两边字节序。