SerialPortManager总结

来源:互联网 发布:通达信 kdj源码 编辑:程序博客网 时间:2024/05/16 09:41

主显和客显端,通用文件SerialPortManager

在主显或者客显端,界面启动serviceservice中实例化一个SerialPortManager对象,SerialPortManager的构造函数中启动一个串口数据的接收线程,接收从对方发送过来的串口数据。如果此线程接收到了数据,也就是size > 0的情况,通过消息机制通知service对数据进行处理,即service中的方法operData(),

operData方法对缓冲byte数组进行while循环,若是buffer[i] == 0x02则说明这是数据头,也是数据的开始,然后将此i值赋给buffer_beginwhile继续若是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.客显会对数据进行解析,解析时没有发现数据有什么问题的话,会把数据显示在界面上,然后向主显反馈数据正确信息,errorcode0;如果解析时发现数据有问题,则会把数据错误的errorcode发送给主显端。

2.如果是主显端,则知道它是来自客显端对于销售数据的反馈,也会对数据进行解析,首先分析流水号,然后分析errorcode,如果errorcode为零,则此条数据发送完毕,并把此条数据从发送listremove;如果errorcode不为零,则会对此条数据进行重新发送。

如果不是销售数据,则另作处理。

至此,一条数据的解析完毕。但是线程接收的可能不止一条数据,所以while循环还是要继续。数据解析完毕之后,把表示数据开始的下标buffer_begin指向buffer_end

 

在处理数据过程中,下标的处理十分重要。

在处理一条数据之前,buffer_beginbuffer_end指向的是同一个地方,如果service接收到来自SerialPortManager的数据处理消息的话,buffer_begin不动,buffer_end指向数据末尾,即把从SerialPortManagerhandler传过来的参数赋给它,如下:

buffer_end = SodoFuns.objToInteger(msg.obj);

然后在operData方法中对于buffer_begin进行移动。operData方法结束之后,再把buffer_end赋给buffer_begin让他们指向同一个地方,等待着下一次数据的处理。

 

0 0
原创粉丝点击