SerialPortManager总结
来源:互联网 发布:通达信 kdj源码 编辑:程序博客网 时间:2024/05/16 09:41
主显和客显端,通用文件SerialPortManager
在主显或者客显端,界面启动service,service中实例化一个SerialPortManager对象,SerialPortManager的构造函数中启动一个串口数据的接收线程,接收从对方发送过来的串口数据。如果此线程接收到了数据,也就是size > 0的情况,通过消息机制通知service对数据进行处理,即service中的方法operData(),
operData方法对缓冲byte数组进行while循环,若是buffer[i] == 0x02,则说明这是数据头,也是数据的开始,然后将此i值赋给buffer_begin,while继续,若是buffer[i] == 0x03,则说明从buffer_begin到此i是一条完整的数据,数据的长度为
int len = (i-buffer_begin+1+buffer.length)%buffer_len;
然后对于此条数据进行分析,看其是否符合数据格式要求
retDataManager.check(buffer,buffer_begin,(i+1)%buffer_len,buffer_len),
数据格式应符合下面要求
头
长度:
流水号:
动作类型
数据体
校验码
尾
0x02
4位
2位
1位
4位
0x03
check方法中要对长度,流水号,动作类型,校验码都进行check(怎么check,后面详细分析),check无误之后,再对数据进行下一步解析。首先判断此数据是不是销售数据,如果是销售数据,主客显则有不同的处理:
1.客显会对数据进行解析,解析时没有发现数据有什么问题的话,会把数据显示在界面上,然后向主显反馈数据正确信息,errorcode为0;如果解析时发现数据有问题,则会把数据错误的errorcode发送给主显端。
2.如果是主显端,则知道它是来自客显端对于销售数据的反馈,也会对数据进行解析,首先分析流水号,然后分析errorcode,如果errorcode为零,则此条数据发送完毕,并把此条数据从发送list中remove;如果errorcode不为零,则会对此条数据进行重新发送。
如果不是销售数据,则另作处理。
至此,一条数据的解析完毕。但是线程接收的可能不止一条数据,所以while循环还是要继续。数据解析完毕之后,把表示数据开始的下标buffer_begin指向buffer_end。
在处理数据过程中,下标的处理十分重要。
在处理一条数据之前,buffer_begin和buffer_end指向的是同一个地方,如果service接收到来自SerialPortManager的数据处理消息的话,buffer_begin不动,buffer_end指向数据末尾,即把从SerialPortManager中handler传过来的参数赋给它,如下:
buffer_end = SodoFuns.objToInteger(msg.obj);
然后在operData方法中对于buffer_begin进行移动。operData方法结束之后,再把buffer_end赋给buffer_begin,让他们指向同一个地方,等待着下一次数据的处理。
- SerialPortManager总结
- 总结
- 总结
- 总结
- 总结
- 总结!
- 总结
- 总结.
- 总结。
- 总结
- 总结
- 总结
- 总结
- 总结
- 总结
- 总结
- 总结
- 总结
- 【入门】数组练习:验证下面结论 【数组】
- xcode6 如何编译64位iOS应用
- 表达式求值
- Intersection of Two Linked Lists
- CodeForces 388A Fox and Box Accumulation(贪心)
- SerialPortManager总结
- Mayor's posters(线段树区间更新+离散化)
- Perl 域名转换为IP
- Eclipse MyEclipse 使用 复制粘贴 卡、缓慢的解决办法
- 图片处理--处理成灰色图片,高斯模糊
- 微信摇一摇.周边 (技术实施原理)
- matlab画三角形,多边形
- GDB 调试积累心得,断点,查栈,下一步,跳入,跳出等简单操作
- 活了二十多年,今天才知道柚子是怎样挑的