Android项目笔记三:wifi传输当中各种数据转换
2016-05-30 10:55
609 查看
通过wifi和下面单片机通信,避免不了各种数据转换:
安卓端:
一、String转化为float
try {
floatValue = Float.valueOf(strValue);
floatTemp = Float.valueOf(strTemp);
}catch (NumberFormatException e){
e.printStackTrace();
continue;
}catch (NullPointerException e){
e.printStackTrace();
continue;
}
String转换为其它数据格式类似;
二、socket接收数据处理
this.receivebuf = new byte[20]; //根据协议设置大小
int receivebufLong=0; //实际读出个数
try {
receivebufLong=this.receiveStream.read(this.receivebuf);//线程阻塞
}catch (IOException e){
e.printStackTrace();
Message msg = new Message();
msg.what=1;
msg.arg1=1;//出现异常
UIHandler.sendMessage(msg);
return;
}
这样socket数据就在receivebuf 数组中,个数为receivebufLong;
1、传输数据0~2000:
假如下面单片机要传输的数据为0~2000,一个字节肯定放不下,那么我们传输一般是这么做
uint16 temp = userData;
uint8 sendBuffer[10];
sendBuffer[0] =userData>>8;
sendBuffer[1] =userData;
rs232TX(sendBuffer,2);
那客户端接收到数据怎么处理呢?我的方法如下:
由于Android中没有无符号数据类型,所以我要用int进行处理:
int userDataIn = 0;
int temp=0;
userDataIn = (int) receivebuf[0];
userDataIn = (userDataIn <<8) & 0x0000FF00;
temp = (int)receivebuf[1];
temp = temp & 0x000000FF;
userDataIn = userDataIn | temp ;
2、传输数据-50.0~124.9温度数据怎么做呢
假设温度传感器读书数据已经转换好,并且是扩大10倍(带一位小数)
int16 temp =0;
temp = ds18b20H;
temp = (temp <<8) & 0xFF00;
temp = temp | ds18b20L;
这个temp就是扩大10倍的温度(带一位小数),可以用于显示等等。。。。
单片机传输类似1,这里讲下客户端转换:
方案一(我的实现):
int userTemp = 0;
int userTempH = 0;
int userTempL = 0;
float user = 0;
userTempH = sendBuffer[0] ;
userTempH = (userTempH << 8) & 0x0000FF00 ;
userTempL = sendBuffer[1] ;
userTempL = userTempL & 0x000000FF;
if((sendBuffer[0] == 0x80) && (sendBuffer[1] == 0x00)){
//最大负数
userTemp = -32768;
}else if((sendBuffer[0] & 0x80) == 0x80){
//负数
userTemp = userTempH | userTempL | 0xFFFF0000;
}else{
//正数
userTemp = userTempH | userTempL | 0x00000000;
}
user = (float)userTemp;
user = user /10;//实际温度
方案二(我的新想法,未验证):
int userTemp1 = 0;
int userTemp 2 = 0;
float user = 0;
userTemp1 = (int) sendBuffer[0];
userTemp2 = ((int) sendBuffer[1]) & 0x000000FF;
userTemp1 = (userTemp1 << 8) & 0x0000FF00;
userTemp1 = userTemp1 | userTemp2;
if(userTemp1 == 0x00008000){
userTemp1 = -32768;
}else if((userTemp1 & 0x00008000) == 0x00008000){
userTemp1
|= 0xFFFF0000;
}
user = userTemp1;
user = user/10;//实际温度
安卓端:
一、String转化为float
try {
floatValue = Float.valueOf(strValue);
floatTemp = Float.valueOf(strTemp);
}catch (NumberFormatException e){
e.printStackTrace();
continue;
}catch (NullPointerException e){
e.printStackTrace();
continue;
}
String转换为其它数据格式类似;
二、socket接收数据处理
this.receivebuf = new byte[20]; //根据协议设置大小
int receivebufLong=0; //实际读出个数
try {
receivebufLong=this.receiveStream.read(this.receivebuf);//线程阻塞
}catch (IOException e){
e.printStackTrace();
Message msg = new Message();
msg.what=1;
msg.arg1=1;//出现异常
UIHandler.sendMessage(msg);
return;
}
这样socket数据就在receivebuf 数组中,个数为receivebufLong;
1、传输数据0~2000:
假如下面单片机要传输的数据为0~2000,一个字节肯定放不下,那么我们传输一般是这么做
uint16 temp = userData;
uint8 sendBuffer[10];
sendBuffer[0] =userData>>8;
sendBuffer[1] =userData;
rs232TX(sendBuffer,2);
那客户端接收到数据怎么处理呢?我的方法如下:
由于Android中没有无符号数据类型,所以我要用int进行处理:
int userDataIn = 0;
int temp=0;
userDataIn = (int) receivebuf[0];
userDataIn = (userDataIn <<8) & 0x0000FF00;
temp = (int)receivebuf[1];
temp = temp & 0x000000FF;
userDataIn = userDataIn | temp ;
2、传输数据-50.0~124.9温度数据怎么做呢
假设温度传感器读书数据已经转换好,并且是扩大10倍(带一位小数)
int16 temp =0;
temp = ds18b20H;
temp = (temp <<8) & 0xFF00;
temp = temp | ds18b20L;
这个temp就是扩大10倍的温度(带一位小数),可以用于显示等等。。。。
单片机传输类似1,这里讲下客户端转换:
方案一(我的实现):
int userTemp = 0;
int userTempH = 0;
int userTempL = 0;
float user = 0;
userTempH = sendBuffer[0] ;
userTempH = (userTempH << 8) & 0x0000FF00 ;
userTempL = sendBuffer[1] ;
userTempL = userTempL & 0x000000FF;
if((sendBuffer[0] == 0x80) && (sendBuffer[1] == 0x00)){
//最大负数
userTemp = -32768;
}else if((sendBuffer[0] & 0x80) == 0x80){
//负数
userTemp = userTempH | userTempL | 0xFFFF0000;
}else{
//正数
userTemp = userTempH | userTempL | 0x00000000;
}
user = (float)userTemp;
user = user /10;//实际温度
方案二(我的新想法,未验证):
int userTemp1 = 0;
int userTemp 2 = 0;
float user = 0;
userTemp1 = (int) sendBuffer[0];
userTemp2 = ((int) sendBuffer[1]) & 0x000000FF;
userTemp1 = (userTemp1 << 8) & 0x0000FF00;
userTemp1 = userTemp1 | userTemp2;
if(userTemp1 == 0x00008000){
userTemp1 = -32768;
}else if((userTemp1 & 0x00008000) == 0x00008000){
userTemp1
|= 0xFFFF0000;
}
user = userTemp1;
user = user/10;//实际温度
相关文章推荐
- Android 6.0的变化之权限管理
- android Service 的简单使用
- android xml文件重复控件 包装style
- 【Android测试】【第七节】Monkey——源码浅谈
- Android开发中Activity的生命周期及加载模式详解
- android集成支付宝sdk
- Android Monkey Test
- fir.im Weekly - 如何打造真正的工程师文化
- 百度地图Android SDK
- Android与服务器端数据交互(基于SOAP协议android+webservice)
- Android 读取本地(SD卡)图片
- Android性能优化策略
- Android Studio如何设置代码自动提示
- Android和html5的js交互
- Android 6.0+ 运行时权限探索
- Android Launcher浅析(二)
- Android-PullToRefresh 使用心得
- Android之AlarmManager
- 记Android Studio自定义属性访问不了的问题
- fragement生命周期