这周以来一直在写一个仪表的测试程序,就是把仪表的所有参数都读取出来,然后把这些数据按照协议的格式显示出来。 也是边写边想思路,觉得写得很慢。以为想到了一个不错的数据发送流程和接收流程,不过没有考虑到仪表参数量比较多,一次召调只是读取一个参数,导致了显示界面中数据的更新很慢,当仪表检测到的数据发生变化了有一些时间,界面上还没有更新。明天考虑重新设计一下数据发送流程,一次发发送读取N个参数。这样可以使得读取仪表的参数变快。
在写这个程序中,感觉自己想到了几个比较好的编程小技巧和数据发送要注意的地方。在这里,自己记录一下,小结一下加深印象。
1)常量的应用。由于仪表的参数有可能更加,各种类型的参数的个数也会增加。而在程序中,有一些地方会用到这些数据,所以把各种类型参数的个数定义成常量,这样可以提高代码的可读行,也便于以后随着仪表协议的改变而修改程序。
2)枚举的使用。仪表中有好几种类型参数,可以用枚举定义一个变量表明各个类型的参数数据。这样还可以和数组配合使用。
private enum DataTypes { JKZ, SJSOE,SGSOE,KGL, JDQ,SystemParm,ZDZ } //把仪表的几个数据类型定义成一个枚举
3)协议分析想法。可以考虑根据协议的个数,定义一些变量。主要要注意协议中不同类型报文的区别,然后根据这些定义一些变量或者数组。以自己用到的3720协议中,把仪表中的参数类型、每种类型参数的总数、报文中的Qualifier字节、KEY中的高位,定义成数组和变量。
private enum DataTypes { JKZ, SJSOE,SGSOE,KGL, JDQ,SystemParm,ZDZ } //把仪表的几个数据类型定义成一个枚举
private int[] DataTypesLen =new int[]{ JKZNum, SJSOENum,SGSOENum, KGLNum, JDQNum, SystemParmNum, ZDZNum };//每种数据类型的个数
private byte[] KEYHighValue = new byte[] { 0x41, 0xa0, 0xa3, 0x14, 0x11, 0x20, 0x80 };//各种数据类型的KEY的高字节数据
private byte[] Qualifier = new byte[] { 0,0,0,0,0,0,2 };
4)定时器使用一个注意点。刚开始写程序时,遇到一个问题:我是用一个定时器定时地按顺序发送一组组报文,还定超时。最初没有在发送报文之前先把定时器关闭,然后再发送报文,发送完后再开定时器,在这种情况下就会发生一个问题,就是在没有把报文发送出去,就发生定时时间中断,而去累加超时变量。使得数据的发生顺序错乱。