地点:软件大楼211
时间:2013.12.20
一点感悟:
材料院的这个项目越做水越深,需求不止,而报酬不增。在学校当学生为学校办事不计较报酬,但当一个快要做完的项目而客户又提出新的需求时,我们付出的代价非常高,一是由于自身原因,我们三两个人的小团队组成的软件小作坊并没有形成代码规范,纯粹是为了完成功能而设计,并没有考虑未来功能的扩展。二是在做项目过程中还有别的项目别的事穿插,和客户交互也不是很平常,所以导致项目进步跟不上。
问题描述:
这个项目要完成的任务是开发一个软件,使得研究材料的大神们能够很方便的使用仪器测试、分析材料性能的拉伸特性。新仪器数据通过串口上传,这本来很简单,得到数据包按协议解析就可,但偏偏还有个贵重的老仪器,通过并口上传数据,问题在于老设备和新设备要能够一起协调和谐工作,而且老设备不提供任何技术支持和相关协议,是一个逆向功能,这就郁闷了,所以数据包的解析我们都是一个一个对应分析,像是破解密码。
问题分析:
好在数据规律性很强,我们一边看面板上的显示数据,一边对照上传的编码很快找到了一种线性对应关系,但不好在是每次我们获取的是8bit的数据,而实际上面板上能显示的远不止256个数字,继续细入分析发现从00——FF一周期后又进入下一轮00——FF周期,奇葩的是我们无法得到更多的信息以便我们知道数据处在哪一周期里,也就是说同一个符号编码对应着不同的实际数据,这个实际数据先要知道它落在哪一周期我们才能具体计算。记得通信原理里边就有一种编码方案,它代表的实际值也是要知道落在哪一段才能计算得到。我由这二得到启发。
我们的解决办法是既然纤维拉升测试是一个连续的过程,可设计一个计数器,每跳出一周期前进或者后退计数器做出相应的增减,知道计数器的值后计算实际值在前面工作得的基础上已经是件很容易的事了。
然而挑战又来了,我们到底怎么设计一个算法当得到一个新数据后计数器该加还是该减还是不变呢。
问题解决:
起初想的几个方法也能大概得到周期计数器的值,但经过多次测试后,特别是当纤维打滑时,周期计数器计数不稳定,很容易出错,这对于实验人员是很糟糕的,因为即便是打滑了,实验看起来依然正常,所以后来我做了这样一个处理:
1.首先由8bit的原始数据我们能表示256个数字,把它们均分为三段 : 0——85为一号段 85——170为二号段 170——255为三号段
2.我们把新得到的数据和旧数据做比较:
如果旧数据在三号段,新数据在一号段,我们对周期计数器进行加1;
如果旧数据在一号段,新数据在三号段,我们对周期计数器进行减1;
其他情况我们则认为不变,一直处在本周期之中,这样我们对打滑问题能够得到很好的解决。
当然,这里面也有问题,比如当旧数据在三号段,而新数据本在下一周期中的二号段时,我们的周期计数器并没有增加,给出给用户的数据是一个还是处在本周期的错误值,这样设计的算法本身是一个矛盾,如果不这样处理,那么还是像以前一样,一旦打滑就出错,但对于实验本身来说,这么设计是合理的,因为对于纤维性能的测试,数据本身跳跃性很小,即便打滑也很小,所以已经能够满足要求。
~哎,问题总是有办法的,多费个神而已。