private DispQueueThread DispQueue;
private AssistBean AssistData;
private SerialControl ComA;
@Override
public void initView() {
ComA = new SerialControl();//开启串口
DispQueue = new DispQueueThread();//开启线程实时获取数据
DispQueue.start();//线程启动
AssistData = getAssistData();//串口实体类
ComA.setPort("/dev/ttyS5");//串口号,需要向硬件工作人员要
ComA.setBaudRate("115200");//波特率,后台要
OpenComPort(ComA);//发送指令
new Thread() {
@Override
public void run() {
executorService = Executors.newSingleThreadScheduledExecutor();
executorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
ComA.sendHex("fc0000000000");
}
}, 0, 500, TimeUnit.MILLISECONDS);
}
}.start();
private void endExecutorScan() {
if(executorService != null) {
executorService.shutdownNow();
}
executorService = null;//非单例模式,置空防止重复的任务
}
//这是没有指令直接获取硬件数据的方法,假如需要发送指令ComA.setHexLoopData(“指令”);
//假如,要求一秒获取多次数据的情况,上面多出来的代码就是,在需要开始发送的地方写线程开启,在需要关闭和OnDestiory里面条用关闭
//还有一种方法是用sleep不推荐使用,一般硬件要求比较严格sleep对于时间有一个累计的过程不提倡使用,在SerialHelper.Java里面有个方法也是做的一个自动发送功能,其原理就是sleep。SO,我这边直接用的这个
}
private class SerialControl extends SerialHelper {//工具
public SerialControl() {
}
@Override
protected void onDataReceived(final ComBean ComRecData) {
//数据接收量大或接收时弹出软键盘,界面会卡顿,可能和6410的显示性能有关
//直接刷新显示,接收数据量大时,卡顿明显,但接收与显示同步。
//用线程定时刷新显示可以获得较流畅的显示效果,但是接收数据速度快于显示速度时,显示会滞后。
//最终效果差不多-_-,线程定时刷新稍好一些。
DispQueue.AddQueue(ComRecData);//线程定时刷新显示(推荐)
}
}
private class DispQueueThread extends Thread {//线程
private Queue QueueList = new LinkedList();
@Override
public void run() {
super.run();
while (!isInterrupted()) {
final ComBean ComData;
while ((ComData = QueueList.poll()) != null) {
runOnUiThread(new Runnable() {
public void run() {
DispRecData(ComData);
}
});
// try
// {
// Thread.sleep(100);//显示性能高的话,可以把此数值调小。
// } catch (Exception e)
// {
// e.printStackTrace();
// }
break;
}
}
}
public synchronized void AddQueue(ComBean ComData) {
QueueList.add(ComData);
}
}
private int count = 0;
private void DispRecData(ComBean ComRecData) {//获取硬件数据的地方
StringBuilder sMsg = new StringBuilder();
sMsg.append(ComRecData.sRecTime);
sMsg.append("[");
sMsg.append(ComRecData.sComPort);
sMsg.append("]");
sMsg.append(MyFunc.ByteArrToHex(ComRecData.bRec));
count++;
String substring = MyFunc.ByteArrToHex(ComRecData.bRec).trim().replaceAll(" ", "").substring(MyFunc.ByteArrToHex(ComRecData.bRec).trim().replaceAll(" ", "").length() - 8);
long i = Long.valueOf(substring, 16);
Log.d("aaaaaaaaaa", "" + i);
if (ComA != null) {
ComA.stopSend();
ComA.close();
}
}
private AssistBean getAssistData() {
SharedPreferences msharedPreferences = getSharedPreferences("ComAssistant", Context.MODE_PRIVATE);
AssistBean AssistData = new AssistBean();
try {
String personBase64 = msharedPreferences.getString("AssistData", "");
byte[] base64Bytes = Base64.decode(personBase64.getBytes(), 0);
ByteArrayInputStream bais = new ByteArrayInputStream(base64Bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
AssistData = (AssistBean) ois.readObject();
return AssistData;
} catch (Exception e) {
e.printStackTrace();
}
return AssistData;
}
private void OpenComPort(SerialHelper ComPort) {
try {
ComPort.open();
} catch (SecurityException e) {
ShowMessage("打开串口失败:没有串口读/写权限!");
} catch (IOException e) {
ShowMessage("打开串口失败:未知错误!");
} catch (InvalidParameterException e) {
ShowMessage("打开串口失败:参数错误!");
}
}
private void ShowMessage(String sMsg) {
Toast.makeText(this, sMsg, Toast.LENGTH_SHORT).show();
}