您的位置:首页 > 其它

关于蓝牙接收数据的解决方案

2014-04-13 16:27 218 查看
一开始的时候蓝牙应用只接受单片机串口发来的一个温度数据,所以也没啥问题,存在的一个现象第一个数据丢失的问题被我在单片机程序中加一个空格键解决了。后来应用需要同时接受好几个个传感器数据,问题就来了。以下是本人在调试中的各种方案以及出现的现象,水平较低,不喜勿喷。

第一个解决方案:

if(i==0)
{
String readMessage1 = new String(readBuf, 0, msg.arg1);
mInputEditText1.setText(readMessage1);

i=1;
}
else if(i==1)
{
String readMessage2 = new String(readBuf, 0, msg.arg1);

mInputEditText2.setText(readMessage2);

i=2;
}
else if(i==2)
{
String readMessage3 = new String(readBuf, 0, msg.arg1);
mInputEditText3.setText(readMessage3);

i=0;
}
出现现象是数据可以接受但是不同同时显示三个数据,而且总是在跳变,给人以眼花缭乱的感觉,用户体验特比差,而且后期的语音也没法在此基础上做,故果断舍弃。

第二种解决方案:

在lanya.java中进行判断

Float f = Float.parseFloat(readMessage);

if(f>3.0)
{

mInputEditText1.setText(String.valueOf(f));
}
else if((f>1.5)&&(f<3))
{
mInputEditText2.setText(String.valueOf(f));
}
else if(f<2.0)
{
mInputEditText3.setText(String.valueOf(f));
}


这种方法看似理论上可行,但是在实际运行中多次出现程序崩溃的现象,而且有事接收不到数据,故果断舍弃。

第三种方案:

在线程中进行判断
while (true) {
try {
// 读取输入流
if( (bytes = mmInStream.read(buffer)) > 0 )
{
byte[] buf_data = new byte[bytes];
for(int i=0; i<bytes; i++)
{
buf_data[i] = buffer[i];
}
String s = new String(buf_data);
Float f = Float.parseFloat(s);
if((f>3.0)&&(f<5.0))
{

mHandler.obtainMessage(LanYa.MESSAGE_READ1, bytes, -1, buffer)
.sendToTarget();
}
else if((f>1.0)&&(f<3.0))
{

mHandler.obtainMessage(LanYa.MESSAGE_READ2, bytes, -1, buffer)
.sendToTarget();
}
else if(f<0.2)
{

mHandler.obtainMessage(LanYa.MESSAGE_READ3, bytes, -1, buffer)
.sendToTarget();
}}
在LanYa.java中
case MESSAGE_READ1:

byte[] readBuf1 = (byte[]) msg.obj;

String readMessage1 = new String(readBuf1, 0, msg.arg1);
mInputEditText1.setText(readMessage1);


这样就不会出现程序崩溃的现象,注意上面的判断,如果超出或小于某一值的时候手机界面中不予显示,这样可有效防止乱码现象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: