package com.newland.thread;import android.os.AsyncTask;import com.newland.base.Global;
import com.newland.jni.Linuxc;
import com.newland.model.ShareData;/****
 * 异步读取传感器数据(异步任务<范式参数>)
 * 
 * @author Administrator
 * 
 */
public class ReceiveThread extends AsyncTask<Integer, String, Integer> {
char data[] = new char[1024];
private int datalen = 0;
private int _head;
private int count = 0;
private boolean islen = false;
private int lengthcount = 21;
private char funCode = 0x01;// 功能码 // =+3876@00=+0093@00
// 后台执行不可加入UI操作
@Override
protected Integer doInBackground(Integer... params) {
int len = 0;
char d[] = new char[1024];
String str_receive = null;
while (Global.com_modbus > 0) {
if (!islen) {
str_receive = Linuxc.receiveMsgUartHex(Global.com_modbus);
}
if (this.isCancelled()) {
break;
}
try {
Thread.currentThread().sleep(45);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (str_receive == null) {
continue;
}
len = str_receive.length();
count = len + count;
if (len == 0) {
continue;
}
d = str_receive.toCharArray();
System.arraycopy(d, 0, data, datalen, len);
datalen += len;
while (true) {
islen = false;
_head = findCharInReceiveData(0, (char) 0x01);
if (_head < 0) // 查找不到,把所有的数据丢掉
{
datalen = 0;
break;
}
lengthcount = 6;
if (datalen < lengthcount) { // 数据量小于6个不判断
break;
}
funCode = (char) 0x01;
int length = 1;
if (data[_head + 1] != funCode) {
if (datalen >= lengthcount) {
datalen = datalen - lengthcount - _head;
if (datalen > 0) {
System.arraycopy(data, _head + lengthcount,
data, 0, datalen);
}
}
continue;
} else {
// 正确执行命令的返回数据
if (datalen - _head < lengthcount) {
// 数据没有接收完,等待收完在处理
break;
}
if (data[_head + 2] != length) {
datalen = datalen - lengthcount - _head;
System.arraycopy(data, _head + lengthcount, data,
0, datalen);
break;
}
ShareData.mdata.firsttime = System.currentTimeMillis();
ShareData.mdata.length = data[_head + 2];
ShareData.mdata.data4150 = data[_head + 3]; datalen = datalen - lengthcount - _head;
System.arraycopy(data, _head + lengthcount, data, 0,
datalen); if (datalen >= lengthcount) {
islen = true;
} else {
islen = false;
}
count = 0; }
} } return 1;
} // 用于执行完后台任务后更新UI,显示结果
protected void onPostExecute(Integer result) {
super.onPostExecute(result);
} // 执行后台任务前做一些UI操作
protected void onPreExecute() {
super.onPreExecute();
} protected void onProgressUpdate(String... values) { } /**
 * 判断昆仑海岸的值正数返回,负数返回0
 * 
 * @param data
 * @return
 */
private int judge(String data) {
if (data.contains("+")) {
return Integer.parseInt(data.substring(1));
} else {
return 0;
} } private int findCharInReceiveData(int start, char ch2) {
for (int i = start; i < datalen; i++) {
if (data[i] == ch2) {
return i;
}
}
return -1;
}}str_receive收到的数据为: