Android 对接硬件串口篇
简介:硬件设备有IC卡片,指压测试仪(测试脉搏信号、心率、血压),经过串口获取硬件设备发送的数据。
正文:第一步:获得硬件设备,应用市场下载串口调适软件,测试一下在Android环境下数据是否能正常获取,
第二步:新建项目,开始开发。
第三步:时间紧任务重,直接上代码。
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<ComBean> QueueList = new LinkedList<ComBean>(); @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(); }
本次串口到此结束,本人技术有限,就不做详细的介绍,怕误人子弟。直接上能直接运行的代码。都能节省时间,至于原理,想了解的我不写也回去了解,不想了解的我写了也没人看
有用请点赞、评论、推荐、关注,三克油