找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1808|回复: 9
收起左侧

解码一个报文一般怎样写程序?

[复制链接]
ID:333483 发表于 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'))       
    {
       执行的操作...
    }                       
}


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

使用道具 举报

ID:311903 发表于 2022-2-10 16:02 | 显示全部楼层
$AA,111,BB,222,<$$>  建议 将这帧报文拆开,头部为 $ ,收到头部后,接下来是  14个字节的数据部分(AA,111,BB,222,),再接下来是 尾部 <$$> ,这样为正常的一帧,然后再处理数据部分的内容
回复

使用道具 举报

ID:313048 发表于 2022-2-10 16:06 | 显示全部楼层
如果长度格式都是一样的,则可以直接用scanf进行解析,前提是保证数据正确,不丢包等。
回复

使用道具 举报

ID:333483 发表于 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,这样感觉程序执行的效率就很低,一般是不是不该这样写,这种情况应该怎么设计结构?
回复

使用道具 举报

ID:879348 发表于 2022-2-10 17:27 | 显示全部楼层
不用担心效率,按照人脑思维习惯写是最好的
回复

使用道具 举报

ID:415064 发表于 2022-2-10 17:29 | 显示全部楼层
memcmp
回复

使用道具 举报

ID:824490 发表于 2022-2-10 19:04 | 显示全部楼层
只是书写时看上去效率低,实际运行效率可能并不低。你试试转译成汇编对比一下。
回复

使用道具 举报

ID:624769 发表于 2022-2-10 19:35 来自手机 | 显示全部楼层
很多人的通病,总以为看上去复杂,效率低,殊不知,往往看上去很简单的,其实反而效率是极低的。一个是程序员容易看,一个是单片机容易执行,你更看重哪个?
回复

使用道具 举报

ID:625730 发表于 2022-2-10 22:02 | 显示全部楼层
a2966124 发表于 2022-2-10 17:02
比如我拆开了,吧AA111BB222存在了数组a里面,那我不是还是要比对if(a[0]==A&&a[1]==A)吗?如果这个AA有 ...

首先报文要收全,然后再根据报文定义去解析,如果每一部分是多个字符的字符串,就先分解成字符串,然后再去比较,不一定要按一个个数组单元去比较,那样比较费神、费眼。
回复

使用道具 举报

ID:311903 发表于 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之类的标准函数就可以了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表