安卓app如何处理串口的响应信息
来源:互联网 发布:淘宝企业店铺有优势吗 编辑:程序博客网 时间:2024/06/13 15:50
大多数串口的响应是不需要处理的,命令发了也就发了。但严格来说,每一次命令发出去后,上层应用最好是做相应的处理。如果成功啦,就继续干别的;如果失败了,可以重试或者给用户相应的提示。
最近公司的项目里就遇到了这个情况。app对串口的响应非常依赖。其中最难的地方是,若干条串口命令是有顺序的,需要短时间内执行完,但是后面的命令依赖于前面命令的执行。若前面命令执行失败了,需要重试。那么就要求上层应用对发送的串口命令和其对应的响应一一对应起来。
好,问题来了。我们都知道串口通信是异步的。并且,为了保持通信畅通,每隔一定时间(100ms)还需要发送联络帧。假设我们现在有两种命令各2条共4条,它们的发送顺序是A1、B1、A2、B2。
简化后的流程就是这样了。
一开始觉得有点摸不着头脑,毕竟回调函数都是void,又不能赋值,收到A1的响应后,我该如何告诉上层应用可以发送B1命令了呢。后来我想了一个办法。
1.声明并初始化一个全局变量List<> commandList;
2.准备好所有的命令(A1A2B1B2)并按顺序加到commandList里
commandList.add(A1);commandList.add(B1);commandList.add(A2);commandList.add(B2);
3.编写两个方法
/** * 执行命令列表中的第一个命令 */ private void executeCommand() { if (commandList.size() == 0) { return; } else { //拿出第一条 String command = commandList.get(0); //如有需要做些预处理 //发送串口命令 motorManager.sendCommand(command); } } /** * 移除命令列表中的第一个命令 */ private void removeCommand() { if (commandList.size() == 0) { return; } else { //把第一条命令从列表中移除 commandList.remove(0); //若执行的是当前用户的最后一条命令,则向服务端发送数据 if (commandList.size() == 0) { //命令执行完看还需不需要做什么事情 //比如可以将完成情况写到服务端 } } }
4.将removeCommand和executeCommand方法放在串口回调函数中
MotorCallback motorCallback = new MotorCallback() { @Override public void uartMsg(UartACK ack) { if (ack.errorCode != null && !ack.errorCode.equals("")) { //// 系统异常 if (MotorManager.ERROR_SYSTEM.equals(ack.errorCode) || MotorManager.ERROR_MOTOR_TIMEOUT.equals(ack.errorCode)) { //如果复位次数小于2,则复位,1秒后重发指令 if (resetNum < 2) { //发送复位命令 motorManager.reset(); //new一个绑定在主线程Looper上的Handler //休眠1秒钟后重发指令 Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { @Override public void run() { try { Thread.sleep(1000); executeCommand(); } catch (InterruptedException e) { e.printStackTrace(); } } }); resetNum++; } else { //// TODO: 2017/9/21 复位2次了还有问题,该如何解决? } } else { //// TODO: 2017/9/21 其他异常该如何告知给用户? //ack.errorTip final String errorTip = ack.errorTip; Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { @Override public void run() { //放在UI线程弹Toast Toast.makeText(MealActivity.this, errorTip, Toast.LENGTH_LONG).show(); Log.d(TAG, "Toast.makeText=" + errorTip); } }); } } else { //当A类指令和B类指令执行成功后 //必须定义好这个条件才能保证命令有序执行 if (ack.number != null || ack.deliverWeight != null) { //移除已经执行完的命令 removeCommand(); //继续执行下一个命令 executeCommand(); } } } };
实践证明这样的方式挺好用的。
阅读全文
0 0
- 安卓app如何处理串口的响应信息
- 解析Ajax如何处理响应信息
- 解析Ajax如何处理响应信息
- [安卓基础]拨号器的响应处理
- 深入理解AJAX响应信息的处理
- 深入理解AJAX响应信息的处理
- 深入理解AJAX响应信息的处理
- 深入理解AJAX响应信息的处理
- 深入理解AJAX响应信息的处理
- 安卓获取APP的信息以及整个硬件、系统信息
- 如何获取系统的串口信息
- 如何获取安卓用户的app使用频率
- 多线程,处理结果未标识请求信息,排队通过串口,区分响应
- 如何检索获取安卓图片数据库的所有信息
- 关于如何获取上线后的app异常信息(bug)处理
- 安卓不得不收藏的工具类之获取APP相关的信息
- 如何Python写一个安卓APP
- 安卓如何隐藏APP图标探讨
- centos7安装MySQL
- my first day of CSDN
- tomcat开机自启动
- 二分查找 (java实现)
- 如何通过反射创建对象?
- 安卓app如何处理串口的响应信息
- (数据库)-触发器
- Android Retrofit2的使用
- redis详解
- SpringMVC示例
- Android fitsSystemWindows 作用
- libcudnn.so.6:cannot open sharedobjectfile: No such file or directory
- Whither Swift?
- BZOJ 1030 文本生成器 AC自动机+dp