Board logo

标题: [其他] C++编程又遇到难题了,求大神提示解决思路。。。。。。 [打印本页]

作者: shixn    时间: 2016-6-16 23:44     标题: C++编程又遇到难题了,求大神提示解决思路。。。。。。

PC通过串口链接下位机传数据,就是类似:
0x11 0x22 0x33 0x44.....

要解析成可读的数据,但是每次传输过来解析的方式都不一样,要根据一个配置文件来处理。

比如某次通信,过来100个byte,这里面可能有int32,int16,float,double等等,但是类型,字节位置,乃至高低字节都不固定!

可能1~4字节组一个float,8~5是组一个int32,9~10组一个uint16等等,下次通信的时候可能又都变了!

这些东西是靠一个ini文件规定的(具体内容还可以跟甲方再商量)

[globe]
length=100
[1]
type = float
name = XXX
start_byte =1
end_byte =4
[2]
type = int32
name = YYY
start_byte =8
length_byte =5
[3]
type = uint16
name = ZZZ
start_byte = 9
length_byte = 12

要弄成这样是因为甲方还有很多甲方,甲方要适应各种情况。。。

求各位大神给个解决思路。。。

小弟拜谢。。
作者: 装个逼就跑    时间: 2016-6-17 00:41

posted by wap, platform: Android
斗胆给个建议,求楼下高手们轻喷。
规定发送格式,让甲方每次发一个数据前先发个字符串说明数据类型,比如1是int 2是float 3是字符串之类,然后再发数据,你这边只要做成选择判断然后进入对应的程序段就可以了,这么做的好处是后续也容易进行维护,有新情况的时候临时加一块程序段就行了。
琢磨了一下,如果每发一个数据就要说数据类型太麻烦了,可以这样,比如有十个数据,前三个都是int16,那么发第一个的时候说明数据类型就行了,第二个第三个不用说明,你这边默认还是int16,等第四个数据类型发生变化的时候再声明一次就行了。
但是如果你做的系统不支持长跳转的话我也没啥好办法了……

本帖最后由 装个逼就跑 于 2016-6-17 00:48 通过手机版编辑
作者: shixn    时间: 2016-6-17 01:04

posted by wap, platform: iPad
引用:
原帖由 @装个逼就跑  于 2016-6-17 00:41 发表
斗胆给个建议,求楼下高手们轻喷。
规定发送格式,让甲方每次发一个数据前先发个字符串说明数据类型,比如1是int 2是float 3是字符串之类,然后再发数据,你这边只要做成选择判断然后进入对应的程序段就可以了,这么做的好处是后续也容易进行维护,有新情况的时候临时加一块程序段就行了。
琢磨了一下,如果每发一个数据就要说数据类型太麻烦了,可以这样,比如有十个数据,前三个都是int16,那么发第一个的时候说明数据类型就行了,第二个第三个不用说明,你这边默认还是int16,等第四个数据类型发生变化的时候再声明一次就行了。
但是如果你做的系统不支持长跳转的话我也没啥好办法了……

本帖最后由 装个逼就跑 于 2016617 00:48 通过手机版编辑
数据和说明不是一个渠道。。。

数据是串口

说明是一个文件,存在本地硬盘里

数据那头不能定制,接a设备就需要搭配a的ini,接b设备就需要搭配b的ini(同一设备也可能有若干工作模式,对应不同ini)
作者: kpf190    时间: 2016-6-17 01:32

你不是有解决方法了吗?还要什么建议?
作者: shixn    时间: 2016-6-17 01:59

posted by wap, platform: Android
引用:
原帖由 @kpf190  于 2016-6-17 01:32 发表
你不是有解决方法了吗?还要什么建议?
这些都是甲方给的输入。。

现在数据和ini都读进来了,后面不知道该怎么办了,用代码怎么实现?
作者: 备常炭    时间: 2016-6-17 05:39

这个问题太简单,等我白天抽空告诉你
作者: akirasendoh    时间: 2016-6-17 07:53

posted by wap, platform: Meizu MX4 Pro
读出后用数组存起来,再对照ini作相应的类型转换和处理逻辑。

看错了,处理ini,循环length次,每次先读ini的[ i ],拿到处理类型和处理长度,对应收到的数据再做类型转换和其他逻辑处理。

本帖最后由 akirasendoh 于 2016-6-17 08:04 通过手机版编辑
作者: alexacc    时间: 2016-6-17 08:02

posted by wap, platform: Galaxy Note 5
数据结构
作者: ffcactus    时间: 2016-6-17 08:21

posted by wap, platform: iPhone
你告诉甲方说,你传输的内容必须通过printf打印。C51的的printf本事就是串口打印。
然后根据printf的第一个参数,你这边用scanf来解析就好了。
假如数据量较多,甲方可以每个数据传一行,比如他要传输一个float.就用printf("%s\t%f", "%f\n", 3.14);
你这边就循环读一行,先用scanf("%s\t"读取格式,然后移动指针,再根据格式读数据。
作者: koakon    时间: 2016-6-17 08:36

posted by wap, platform: Chrome
一般不是用串流文件(?二进制格式的那种)暂存一下数据流,然后读取配置文件,根据配置文件组成数组或存储结构,然后分析配置文件,读取参数?
作者: ccccloud    时间: 2016-6-17 08:53

posted by wap, platform: iPhone
自己定义分隔符格式就行
比如0x01  int32 . 0x02 int64 . 0x05 double
如果分隔符的数据没出现,就沿用之前得格式规定。
作者: 安非他命    时间: 2016-6-17 09:07

posted by wap, platform: 红米Note2
把INI配置做成数组或map存起来依次遍历
每个section的配置 读start byte到end byte
依次往下走

这个INI配置文件本身就是算法啊

section不是标了1,2,3,4么
作者: fuckmic    时间: 2016-6-17 09:15

posted by wap, platform: 小米 4
你甲方的每个甲方传过来的数据结构都是固定的吧,而且传过来的地址(地址码或是端口)都是固定的吧。

你可以自己在接受端和处理端自定义一个协议,加个分割符和地址符,说明每段数据的来源,这样处理端就可以根据不同的来源去调用不同的配置文件了。
作者: LTFYH    时间: 2016-6-17 09:25

就根据协议定义好的格式来读啊,没什么特别的啊,想不清楚的话,可以分几步来,先遍历一次根据类型把数据取出来。然后进行解析。
作者: lostcup    时间: 2016-6-17 09:32

posted by wap, platform: iPhone
算法已经给了,就是用ini定义的每一个步长,遍历发送过来的字符串,你要做的就是根据ini去转化数据类型和处理异常情况,已经很直白了
作者: MacPhisto    时间: 2016-6-17 09:42

posted by wap, platform: GOOGLE
就是序列化。参考google的protocol buffers。

https://developers.google.com/protocol-buffers/
作者: MacPhisto    时间: 2016-6-17 09:43

posted by wap, platform: GOOGLE
就是序列化啊。可以参考google的protocol buffer。

https://developers.google.com/protocol-buffers/
作者: 总是注册不成功    时间: 2016-6-17 09:55

posted by wap, platform: iPhone
一切配置神马的都是浮云,if else走起搞定一切!
作者: johentai    时间: 2016-6-17 10:33

posted by wap, platform: Meizu MX4
stream兜住再根据.ini处理,工业用的?
作者: TUT    时间: 2016-6-17 11:06

posted by wap, platform: Firefox
lz说得还不够详细,不过无论如何,数据发送方总要告诉你发过来的数据是对应哪个ini文件的,那么你可以事先将各种可能的ini文件定义成对应的类,都继承自一个基类,调用的时候直接用基类指针指向动态构建的对象就可以统一操作模式了,代码也能简化易懂。发送方告诉你发过来的数据对应哪个ini的时候你就可以动态创建对象。

至于是否需要把所有数据先缓存还是直接边接收边解析,那就看你到底是什么时候知道这些数据是对应哪个ini文件的。

以后有新的ini文件定义时,你只需要对应构建新继承类就可以了,其他代码都不用变,如果ini比较雷同你还可以再继承子类去细化处理方法。

面向对象语言就是用来优化这类处理的。
作者: henvelleng    时间: 2016-6-17 11:17

posted by wap, platform: 小米5
lz的意思是ini格式虽然没确定但应该是统一的

楼下码农都觉得已经没啥好说的了,我也这么觉得




欢迎光临 TGFC Lifestyle (http://club.tgfcer.com/) Powered by Discuz! 6.0.0