标题: 解码一个报文一般怎样写程序? [打印本页]

作者: a2966124    时间: 2022-2-10 15:52
标题: 解码一个报文一般怎样写程序?
比如一个报文的格式为:$AA,111,BB,222,<$$>

通过串口接收进来存在数组buffer里,然后根据这个AA 111 BB 222的不同执行不同的操作这样的程序设计思路是什么?

我是这样写的
if((USART_RX2_BUF[0] == '$')&&(USART_RX2_BUF[1] == 'A')&&(USART_RX2_BUF[2] == 'A'))
{
   if((USART_RX2_BUF[4] == '1')&&(USART_RX2_BUF[1] == '1')&&(USART_RX2_BUF[1] == '1'))       
    {
       执行的操作...
    }                       
}


这样感觉效率很低,一般这种情况应该怎么设计程序。

作者: xws245925587    时间: 2022-2-10 16:02
$AA,111,BB,222,<$$>  建议 将这帧报文拆开,头部为 $ ,收到头部后,接下来是  14个字节的数据部分(AA,111,BB,222,),再接下来是 尾部 <$$> ,这样为正常的一帧,然后再处理数据部分的内容
作者: AUG    时间: 2022-2-10 16:06
如果长度格式都是一样的,则可以直接用scanf进行解析,前提是保证数据正确,不丢包等。
作者: a2966124    时间: 2022-2-10 17:02
xws245925587 发表于 2022-2-10 16:02
$AA,111,BB,222,  建议 将这帧报文拆开,头部为 $ ,收到头部后,接下来是  14个字节的数据部分(AA,111,BB ...

比如我拆开了,吧AA111BB222存在了数组a里面,那我不是还是要比对if(a[0]==A&&a[1]==A)吗?如果这个AA有很多种比如BB CC DD ...这样我就要用很多个if,这样感觉程序执行的效率就很低,一般是不是不该这样写,这种情况应该怎么设计结构?
作者: wufa1986    时间: 2022-2-10 17:27
不用担心效率,按照人脑思维习惯写是最好的
作者: wojiaoguogai    时间: 2022-2-10 17:29
memcmp
作者: 名字不是重点    时间: 2022-2-10 19:04
只是书写时看上去效率低,实际运行效率可能并不低。你试试转译成汇编对比一下。
作者: 188610329    时间: 2022-2-10 19:35
很多人的通病,总以为看上去复杂,效率低,殊不知,往往看上去很简单的,其实反而效率是极低的。一个是程序员容易看,一个是单片机容易执行,你更看重哪个?
作者: TEC    时间: 2022-2-10 22:02
a2966124 发表于 2022-2-10 17:02
比如我拆开了,吧AA111BB222存在了数组a里面,那我不是还是要比对if(a[0]==A&&a[1]==A)吗?如果这个AA有 ...

首先报文要收全,然后再根据报文定义去解析,如果每一部分是多个字符的字符串,就先分解成字符串,然后再去比较,不一定要按一个个数组单元去比较,那样比较费神、费眼。
作者: xws245925587    时间: 2022-2-11 08:30
a2966124 发表于 2022-2-10 17:02
比如我拆开了,吧AA111BB222存在了数组a里面,那我不是还是要比对if(a[0]==A&&a[1]==A)吗?如果这个AA有 ...

如果是固定的,设计一个结构体啊,例如,
struct _demo{
   char cmd_1[3];  //AA
   char data_1[4];  //111
   char cmd_2[3];  //BB
   char data_2[4];  //222
}
后面判断字符串用 strcmp之类的标准函数就可以了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1