找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2667|回復(fù): 9
收起左側(cè)

解碼一個報文一般怎樣寫程序?

[復(fù)制鏈接]
ID:333483 發(fā)表于 2022-2-10 15:52 | 顯示全部樓層 |閱讀模式
比如一個報文的格式為:$AA,111,BB,222,<$$>

通過串口接收進來存在數(shù)組buffer里,然后根據(jù)這個AA 111 BB 222的不同執(zhí)行不同的操作這樣的程序設(shè)計思路是什么?

我是這樣寫的
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'))       
    {
       執(zhí)行的操作...
    }                       
}


這樣感覺效率很低,一般這種情況應(yīng)該怎么設(shè)計程序。
回復(fù)

使用道具 舉報

ID:311903 發(fā)表于 2022-2-10 16:02 | 顯示全部樓層
$AA,111,BB,222,<$$>  建議 將這幀報文拆開,頭部為 $ ,收到頭部后,接下來是  14個字節(jié)的數(shù)據(jù)部分(AA,111,BB,222,),再接下來是 尾部 <$$> ,這樣為正常的一幀,然后再處理數(shù)據(jù)部分的內(nèi)容
回復(fù)

使用道具 舉報

ID:313048 發(fā)表于 2022-2-10 16:06 | 顯示全部樓層
如果長度格式都是一樣的,則可以直接用scanf進行解析,前提是保證數(shù)據(jù)正確,不丟包等。
回復(fù)

使用道具 舉報

ID:333483 發(fā)表于 2022-2-10 17:02 | 顯示全部樓層
xws245925587 發(fā)表于 2022-2-10 16:02
$AA,111,BB,222,  建議 將這幀報文拆開,頭部為 $ ,收到頭部后,接下來是  14個字節(jié)的數(shù)據(jù)部分(AA,111,BB ...

比如我拆開了,吧AA111BB222存在了數(shù)組a里面,那我不是還是要比對if(a[0]==A&&a[1]==A)嗎?如果這個AA有很多種比如BB CC DD ...這樣我就要用很多個if,這樣感覺程序執(zhí)行的效率就很低,一般是不是不該這樣寫,這種情況應(yīng)該怎么設(shè)計結(jié)構(gòu)?
回復(fù)

使用道具 舉報

ID:879348 發(fā)表于 2022-2-10 17:27 | 顯示全部樓層
不用擔(dān)心效率,按照人腦思維習(xí)慣寫是最好的
回復(fù)

使用道具 舉報

ID:415064 發(fā)表于 2022-2-10 17:29 | 顯示全部樓層
memcmp
回復(fù)

使用道具 舉報

ID:824490 發(fā)表于 2022-2-10 19:04 | 顯示全部樓層
只是書寫時看上去效率低,實際運行效率可能并不低。你試試轉(zhuǎn)譯成匯編對比一下。
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2022-2-10 19:35 來自手機 | 顯示全部樓層
很多人的通病,總以為看上去復(fù)雜,效率低,殊不知,往往看上去很簡單的,其實反而效率是極低的。一個是程序員容易看,一個是單片機容易執(zhí)行,你更看重哪個?
回復(fù)

使用道具 舉報

ID:625730 發(fā)表于 2022-2-10 22:02 | 顯示全部樓層
a2966124 發(fā)表于 2022-2-10 17:02
比如我拆開了,吧AA111BB222存在了數(shù)組a里面,那我不是還是要比對if(a[0]==A&&a[1]==A)嗎?如果這個AA有 ...

首先報文要收全,然后再根據(jù)報文定義去解析,如果每一部分是多個字符的字符串,就先分解成字符串,然后再去比較,不一定要按一個個數(shù)組單元去比較,那樣比較費神、費眼。
回復(fù)

使用道具 舉報

ID:311903 發(fā)表于 2022-2-11 08:30 | 顯示全部樓層
a2966124 發(fā)表于 2022-2-10 17:02
比如我拆開了,吧AA111BB222存在了數(shù)組a里面,那我不是還是要比對if(a[0]==A&&a[1]==A)嗎?如果這個AA有 ...

如果是固定的,設(shè)計一個結(jié)構(gòu)體啊,例如,
struct _demo{
   char cmd_1[3];  //AA
   char data_1[4];  //111
   char cmd_2[3];  //BB
   char data_2[4];  //222
}
后面判斷字符串用 strcmp之類的標(biāo)準(zhǔn)函數(shù)就可以了
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表