SerialManage.java 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package com.telpo.faceHengDian.utile.Serial;
  2. import android.app.Activity;
  3. import android.os.Build;
  4. import com.aill.androidserialport.SerialPort;
  5. import com.google.gson.Gson;
  6. import com.telpo.faceHengDian.utile.SerialPortFinder;
  7. import com.telpo.faceHengDian.utile.loacat.AppLogUtils;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. import java.util.Queue;
  11. import java.util.concurrent.ConcurrentLinkedQueue;
  12. import java.util.concurrent.Executors;
  13. import java.util.concurrent.ScheduledExecutorService;
  14. import java.util.concurrent.ScheduledFuture;
  15. import java.util.concurrent.TimeUnit;
  16. /**
  17. * 串口管理类
  18. */
  19. public class SerialManage<A> {
  20. String[] SerialPaths=new String[]{"/dev/smd11","/dev/smd4","/dev/smdcntl8","/dev/smd21","/dev/smd1","/dev/smd6","/dev/smd8","/dev/smdcntl0","/dev/smd3","/dev/smd7","/dev/smd36","/dev/smd2","/dev/smd5","/dev/smd22","/dev/smd_pkt_loopback","/dev/ttyHSL3","/dev/ttyHSL1","/dev/ttyHSL0","/dev/ttyHSL2","/dev/ttyHSL3","/dev/ttyHSL1","/dev/ttyHSL0","/dev/ttyHSL2"};
  21. private static SerialManage instance;
  22. private static SerialPort serialPort;
  23. private ScheduledExecutorService scheduledExecutor;//线程池 同一管理保证只有一个
  24. private SerialHandle serialHandle;//串口连接 发送 读取处理对象
  25. private Queue<String> queueMsg = new ConcurrentLinkedQueue<String>();//线程安全到队列
  26. private ScheduledFuture sendStrTask;//循环发送任务
  27. private boolean isConnect = false;//串口是否连接
  28. //虚拟串口路径
  29. private int YOUR_VID= 0x152A;
  30. private int YOUR_PID = 0x880F;
  31. private SerialManage() {
  32. scheduledExecutor = Executors.newScheduledThreadPool(8);//初始化8个线程
  33. }
  34. public static SerialManage getInstance() {
  35. if (instance == null) {
  36. synchronized (SerialManage.class) {
  37. if (instance == null) {
  38. instance = new SerialManage();
  39. }
  40. }
  41. }
  42. return instance;
  43. }
  44. /**
  45. * 获取线程池
  46. *
  47. * @return
  48. */
  49. public ScheduledExecutorService getScheduledExecutor() {
  50. return scheduledExecutor;
  51. }
  52. /**
  53. * 串口初始化
  54. *
  55. * @param serialInter
  56. */
  57. public void init(SerialInter serialInter) {
  58. if (serialHandle == null) {
  59. serialHandle = new SerialHandle();
  60. startSendTask();
  61. }
  62. serialHandle.addSerialInter(serialInter);
  63. }
  64. /**
  65. * 打开串口
  66. */
  67. public void open(Activity activity) {
  68. String[] DevicesPath=new SerialPortFinder().getAllDevicesPath();
  69. AppLogUtils.e("-------------DevicesPath "+new Gson().toJson(DevicesPath));
  70. String path= "";
  71. if (Build.MODEL.indexOf("F2")!=-1){
  72. path="/dev/ttyS4";
  73. }else {
  74. path="/dev/ttyHSL2";
  75. }
  76. isConnect = serialHandle.open(path, 9600, true);//设置地址,波特率,开启读取串口数据
  77. }
  78. /**
  79. * 打开串口
  80. */
  81. public void open(String path) {
  82. isConnect = serialHandle.open(path, 9600, true);//设置地址,波特率,开启读取串口数据
  83. }
  84. /**
  85. * 发送指令
  86. *
  87. * @param msg
  88. */
  89. public void send(String msg) {
  90. /*
  91. 此处没有直接使用 serialHandle.send(msg); 方法去发送指令
  92. 因为 某些硬件在极短时间内只能响应一个指令,232通讯一次发送多个指令会有物理干扰,
  93. 让硬件接收到指令不准确;所以 此处将指令添加到队列中,排队执行,确保每个指令一定执行.
  94. 若不相信可以试试用serialHandle.send(msg)方法循环发送10个不同的指令,看看10个指令
  95. 的执行结果。
  96. */
  97. if (queueMsg!=null){
  98. queueMsg.offer(msg);//向队列添加指令
  99. }
  100. }
  101. /**
  102. * 关闭串口
  103. */
  104. public void colse() {
  105. if (serialHandle!=null){
  106. serialHandle.close();//关闭串口
  107. }
  108. }
  109. //启动发送发送任务
  110. private void startSendTask() {
  111. cancelSendTask();//先检查是否已经启动了任务 ? 若有则取消
  112. //每隔100毫秒检查一次 队列中是否有新的指令需要执行
  113. sendStrTask = scheduledExecutor.scheduleAtFixedRate(new Runnable() {
  114. @Override
  115. public void run() {
  116. if (!isConnect) return;//串口未连接 退出
  117. if (serialHandle == null) return;//串口未初始化 退出
  118. String msg = queueMsg.poll();//取出指令SerialInter
  119. if (msg == null || "".equals(msg)) return;//无效指令 退出
  120. serialHandle.send(msg);//发送指令
  121. }
  122. }, 0, 100, TimeUnit.MILLISECONDS);
  123. }
  124. //取消发送任务
  125. private void cancelSendTask() {
  126. if (sendStrTask == null) return;
  127. sendStrTask.cancel(true);
  128. try {
  129. Thread.sleep(100);
  130. } catch (InterruptedException e) {
  131. e.printStackTrace();
  132. }
  133. sendStrTask = null;
  134. }
  135. /**
  136. * 找出两个list的不同元素
  137. * @param list1
  138. * @param list2
  139. * @return
  140. */
  141. private static List<String> getDiffByNative(List<String> list1, List<String> list2){
  142. List<String> resultList = new ArrayList<>();
  143. for (String s1 :list1) {
  144. if(!list2.contains(s1)){
  145. resultList.add(s1);
  146. }
  147. }
  148. for (String s2:list2) {
  149. if(!list1.contains(s2)){
  150. resultList.add(s2);
  151. }
  152. }
  153. return resultList;
  154. }
  155. }