主显和客显端,通用文件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,让他们指向同一个地方,等待着下一次数据的处理。