vb2005进行数组比较

深呼吸 2008-05-22 11:44:48
大家好,我现在做的一个程序,用来接收单片机发送的命令,通讯协议的描述如下,[]内为类型描述,每行为一条命令,通过比对每一行内所有的[cmd]类型数据,可以唯一确定此命令,[data]和[check]为变量,不做为判断依据.
FF[cmd] -- [data] 00[cmd] 08[cmd] -- [data] -- [data] -- [check]
FF[cmd] -- [data] 00[cmd] 10[cmd] -- [data] -- [data] -- [check]
FF[cmd] -- [data] 00[cmd] 04[cmd] -- [data] -- [data] -- [check]
FF[cmd] -- [data] 00[cmd] 02[cmd] -- [data] -- [data] -- [check]
FF[cmd] -- [data] 00[cmd] 0C[cmd] -- [data] -- [data] -- [check]
FF[cmd] -- [data] 00[cmd] 14[cmd] -- [data] -- [data] -- [check]
FF[cmd] -- [data] 00[cmd] 0A[cmd] -- [data] -- [data] -- [check]
FF[cmd] -- [data] 00[cmd] 12[cmd] -- [data] -- [data] -- [check]
FF[cmd] -- [data] 00[cmd] 80[cmd] 00[cmd] 00[cmd] -- [check]
FF[cmd] -- [data] 10[cmd] 00[cmd] 00[cmd] 00[cmd] -- [check]
FF[cmd] -- [data] 00[cmd] 20[cmd] 00[cmd] 00[cmd] -- [check]
FF[cmd] -- [data] 00[cmd] 40[cmd] 00[cmd] 00[cmd] -- [check]
FF[cmd] -- [data] 02[cmd] 00[cmd] 00[cmd] 00[cmd] -- [check]
......
在实际接受时的数据可能如下(16进制数组):
FF 01 00 08 00 00 09
FF 01 00 08 00 15 1E
FF 01 00 08 00 27 30
FF 01 00 08 00 36 3F
FF 01 00 08 00 3F 48
FF 01 00 0C 04 3F 50
FF 01 00 0C 18 3F 64
FF 01 00 0C 24 3C 6D
FF 01 00 0C 2D 30 6A
FF 01 00 0C 3F 1E 6A
FF 01 00 0C 3F 0C 58
FF 01 00 04 3F 00 44
FF 01 00 14 3F 12 66
FF 01 00 14 3F 36 8A
FF 01 00 14 3F 3F 93
FF 01 00 14 2A 3F 7E
FF 01 00 14 15 3F 69
FF 01 00 14 00 3F 54
FF 01 00 10 00 3F 50
FF 01 00 10 00 39 4A
FF 01 00 10 00 1E 2F
FF 01 00 00 00 00 01
......

我现在的做法,是将通讯协议硬编码进程序,然后对接收到的数据进行判断,从而分辨出接收到的是什么命令.但是由于要兼容多家协议,全部硬编码不方便不科学,所以现在采用配置文件的方式,来读取通讯协议,并根据配置文件的描述,来对接收到的数据进行判断.
在如何比对接收到的数据和通讯协议时,遇到了问题,如上面描述的那样,我希望能通过读取配置文件,生成一个静态表或者说是一组存在于内存中的变量,然后在每次数据接收后,通过与之相比较,即可判断出是什么命令.但是如何可以做到比较通讯协议中类型为cmd的字节呢?而且如果用循环方式,势必要遍历数组中的每个元素,而通讯协议中的命令很多,采用循环比较是否效率会很低?
能否有一种方式,类似一张对比表(将通讯协议的命令列成表,并将cmd类型标为匹配),接收到的数据当作一个纸条,这样将这个纸条从上往下移动,和表中某一行需要匹配的项目完全吻合即可得到判断?
我现在希望能实现这种比较的方法,但是不知道该如何实现,希望得到大家的帮助!谢谢!
...全文
175 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
深呼吸 2008-05-27
  • 打赏
  • 举报
回复
感谢炎龙无悔,我现在采用的循环对比,虽然没实现类似hash表的查找,但是基本上能解决问题了.但是依然想实现好的算法,来优化模式匹配的速度.结帖.
yanlongwuhui 2008-05-24
  • 打赏
  • 举报
回复
把命令按字符串存储:
FF 01 00 08 00 00 09
FF 01 00 08 00 15 1E
存成字符串,直接进行字符串的比对
“FF010008000009”
“FF01000800151E”
yanlongwuhui 2008-05-23
  • 打赏
  • 举报
回复
如果每种协议中的命令中长度一样,只是命令中的内容不一样,那就用字符串来比对好了,每个字节用2位的十六进制来表示。
深呼吸 2008-05-23
  • 打赏
  • 举报
回复
将命令的格式存进一个数组,实际收到的数据也存进一个数组,然后循环来比较?我主要是觉得这样会效率很低.
因为循环比较,对比一个格式,要遍历数组的所有元素;而且命令很多,可能找到符合的命令格式要遍历到命令数组的最后一条.(7元素数组,50条命令,最多比较7*7*50次)
在想能不能用查表的方式,来对比.
就像酸碱对比纸一样,最多只用循环酸碱度的个数.如果能实现,那我要找到接受到的数据是什么命令,最多只需要循环所有的命令条数次就可以了.(最多比较50次)
深呼吸 2008-05-22
  • 打赏
  • 举报
回复
每种协议的命令具有相同的格式,不同协议的命令相互不同
yanlongwuhui 2008-05-22
  • 打赏
  • 举报
回复
你所可能用到的通讯协议的各命令是定长的,还是根据命令的不同长度是不同?

16,717

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧