通过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;//实际温度