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(); }

  本次串口到此結束,本人技術有限,就不做詳細的介紹,怕誤人子弟。直接上能直接運行的程式碼。都能節省時間,至於原理,想了解的我不寫也回去了解,不想了解的我寫了也沒人看

需要的工具類我上傳了,但是怎麼和文章鏈接不知道

有用請點贊、評論、推薦、關注,三克油

Tags: