欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 解碼一個報文一般怎樣寫程序? [打印本頁]

作者: 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://m.raoushi.com/bbs/) Powered by Discuz! X3.1