基于上一篇文章对红外遥控的分析,由于用于存储的FLASH大小有限,希望红外学习部分用于存储的内容能尽可能少。于是,需要对其进行压缩。
之前的思路是把每一个学到的电平都存储到FLASH中,占用空间比较大。所以考虑对学到的电平进行归类,压缩。
通过对接收到的数据包分析,其中数据都是载波信息和闲置无载波信息间隔构成。我暂且将这样的一对信息称作“码元”,所以一个数据包可以看成是由多个“码元”构成。我的判定思路是:每次取一个码元与之前已经确定的码元种类进行比较,先比较码元长度即两种信息总的时长是否在误差允许范围内,若不在,则表明新的码元种类出现,若在,再去比较码元中两种信息的时长是否在各自误差允许范围内,两个中只要有一个不在其误差范围内,就判定新的码元种类出现。码元区分过程中,难点在于误差范围的设定。我的程序中设定了两个误差设定值,一个是码元长度允许误差COUPLEEROERAGE,一个是码元中载波信息和闲置信息允许误差SINGALERRORATE。设定COUPLEEROERAGE为2ms,因为有些红外数据包,它的不同种类码元间的时长最小误差在2ms左右。基于相同思路,本打算给SINGALERRORATE也设定某个定值,开始时设定200us。但通过测试发现,有些红外编码分析的结果不理想,像红外格式M50560,因为我学习部分学了两个数据包,发现长按情况下,数据包中两个停止位的误差允许达到3ms,若设定200us,学习之后会认为这是一种新的“码元”,导致分析错误。我发现出现这种情况的红外编码大都有个特点,就是它们停止位时长都会在20ms到50ms之间,所以我会判断码元中两种信息的时长有无存在该范围内的,如果有,则将SINGALERRORATE设为3ms,如果没有,则设定SINGALERRORATE设为200us。
之后按这种方式测试各红外编码格式,验证解析成功!!