android 硬件对接,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 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();
}
總結
以上是生活随笔為你收集整理的android 硬件对接,Android 对接硬件串口篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: theme editor android
- 下一篇: 卓app下载(卓赢安卓版)