電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

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

嵌入式經(jīng)常用到串口,如何判斷串口數(shù)據(jù)接收完成?

[復(fù)制鏈接]

485

主題

485

帖子

1623

積分

三級會(huì)員

Rank: 3Rank: 3

積分
1623
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-12-1 17:50:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師8 m, ^4 I3 h+ G2 f& H0 K: y& ^, [
關(guān)注我,一起變得更加優(yōu)秀!說起通信,首先想到的肯定是串口,日常中232和485的使用比比皆是,數(shù)據(jù)的發(fā)送、接收是串口通信最基礎(chǔ)的內(nèi)容。這篇文章主要討論串口接收數(shù)據(jù)的斷幀操作?臻e中斷斷幀一些mcu(如:stm32f103)在出廠時(shí)就已經(jīng)在串口中封裝好了一種中斷——空閑幀中斷,用戶可以通過獲取該中斷標(biāo)志位來判斷數(shù)據(jù)是否接收完成,中斷標(biāo)志在中斷服務(wù)函數(shù)中獲取,使用起來相對簡單。void UART4_IRQHandler(void)
7 P: q+ V  {8 M6 t3 l6 m{
2 p& x; k' k: z2 [. _, J9 D: a1 [    uint8_t data = 0;
# A1 N  `" _6 R* }    data = data;
& `5 b" n' B! y    if(USART_GetITStatus(LoraUSARTx, USART_IT_RXNE) == SET)
' o2 z) T. @' `: S  M) N3 [    {" ~( z3 X4 A" c
        USART_ClearITPendingBit(LoraUSARTx, USART_IT_RXNE);. r1 x* \( S# y8 s7 [
        if(Lora_RecvData.Rx_over == 0), O( [* T" R2 W* W
            Lora_RecvData.RxBuf[Lora_RecvData.Rx_count++] = LoraUSARTx->DR;0 j; L0 A4 V# i0 f" ]  h( M$ ]
    }% @/ M) h* p: g' F0 h- X# g' o
    if(USART_GetITStatus(LoraUSARTx, USART_IT_IDLE) == SET)
# U4 l8 |& \) n4 l9 B; G    {; p6 F& C/ m1 R, g8 u
        data = LoraUSARTx->SR;
$ s/ Z0 k+ b' C        data = LoraUSARTx->DR;. Y- D  Q5 q' f2 R. e2 A
        3 u  c: T6 J' }5 B( s$ ^
        Lora_RecvData.Rx_over = 1; //接收完成- c2 W8 I; o5 M
    }
4 p4 h8 F8 C2 O! }) ]* P}例程中,當(dāng)接收完成標(biāo)志 Lora_RecvData.Rx_over 為1時(shí),就可以獲取 uart4 接收到的一幀數(shù)據(jù),該數(shù)據(jù)存放在 Lora_RecvData.RxBuf 中。3 i8 A: t: e9 s" v5 J
超時(shí)斷幀空閑幀中斷的使用固然方便,但是并不是每個(gè)mcu都有這種中斷存在(只有個(gè)別高端mcu才有),那么這個(gè)時(shí)候就可以考慮使用超時(shí)斷幀了。
$ u* T3 S' l' l: ?" v, L8 sModbus協(xié)議中規(guī)定一幀數(shù)據(jù)的結(jié)束標(biāo)志為3.5個(gè)字符時(shí)長,那么同樣的可以把這種斷幀方式類比到串口的接收上,這種方法需要搭配定時(shí)器使用。
. k/ _3 @+ k, x& ]1 M$ F/ q其作用原理就是:串口進(jìn)一次接收中斷,就打開定時(shí)器超時(shí)中斷,同時(shí)裝載值清零(具體的裝載值可以自行定義),只要觸發(fā)了定時(shí)器的超時(shí)中斷,說明在用戶規(guī)定的時(shí)間間隔內(nèi)串口接收中斷里沒有新的數(shù)據(jù)進(jìn)來,可以認(rèn)為數(shù)據(jù)接收完成。
, g& s9 J$ x! m6 duint16_t Time3_CntValue = 0;//計(jì)數(shù)器初值: C! u9 Q0 I, M
3 g& s6 N% d$ s: U
/*******************************************************************************
( a1 ~8 J/ T$ O; y" d * TIM3中斷服務(wù)函數(shù)+ |4 X% J5 ?) D# D' O5 ?
******************************************************************************/% I9 e6 }9 ]+ R* c7 W0 G+ h4 f
void Tim3_IRQHandler(void). Y. L. ]! |  [; V6 }
{0 \" f/ i: z; G7 j/ S9 T5 h: Z
    if(TRUE == Tim3_GetIntFlag(Tim3UevIrq))1 n7 }+ j& O- d. m, i* f" \
    {
' L! Q) Y5 `: g        Tim3_M0_Stop();    //關(guān)閉定時(shí)器3
. \* Q1 [# d. t4 {- i: g        Uart0_Rec_Count = 0;//接收計(jì)數(shù)清零4 Y" \# H  `. D* d/ ?  ~$ J
        Uart0_Rec_Flag = 1; //接收完成標(biāo)志  V1 z. _7 I& X! w1 s) ]
        Tim3_ClearIntFlag(Tim3UevIrq); //清除定時(shí)器中斷7 c) i# q4 w' n! q* {5 ^& g% z' \
    }7 O$ F+ N' k1 j2 N( I' }/ I
}5 K- U$ T; v" d+ R7 e) v6 d) M

7 ], z& |* C% S5 \( Fvoid Time3_Init(uint16_t Frame_Spacing)$ c9 C% [0 L; {$ ^, m0 ]% S  e4 o$ \+ e
{" v% D  j( O) G% i# w
    uint16_t u16ArrValue;//自動(dòng)重載值
& G8 s* T% t7 U0 o    uint32_t u32PclkValue;//PCLK頻率+ `! z; E! I0 }9 W* D9 @# V/ l4 h
    ) G6 Q. i" F3 B
    stc_tim3_mode0_cfg_t     stcTim3BaseCfg;/ z1 C1 M5 M. h7 a
   
0 \. Q# j6 v! U% f    //結(jié)構(gòu)體初始化清零" Y  [9 d# K% ~  i6 h2 f5 a
    DDL_ZERO_STRUCT(stcTim3BaseCfg);. l" P: p; s( K8 {0 f# G
   
- M+ k* j; P" \/ U# e5 T; e$ r' }    Sysctrl_SetPeripheralGate(SysctrlPeripheralTim3, TRUE); //Base Timer外設(shè)時(shí)鐘使能$ |& b3 m" T- b, P
    - x+ V4 _4 g3 h8 P3 s/ I
    stcTim3BaseCfg.enWorkMode = Tim3WorkMode0;              //定時(shí)器模式
! u9 Z/ Z! y( i" a    stcTim3BaseCfg.enCT       = Tim3Timer;                  //定時(shí)器功能,計(jì)數(shù)時(shí)鐘為內(nèi)部PCLK4 L. m3 b5 [) Q* x3 J- z
    stcTim3BaseCfg.enPRS      = Tim3PCLKDiv1;               //不分頻
3 k0 [( P  \; ]* k. s    stcTim3BaseCfg.enCntMode  = Tim316bitArrMode;           //自動(dòng)重載16位計(jì)數(shù)器/定時(shí)器6 ?8 {. j& w; C1 _% v8 _5 ]" z8 a
    stcTim3BaseCfg.bEnTog     = FALSE;4 F: I3 d8 d0 O; p  v* I# D/ A
    stcTim3BaseCfg.bEnGate    = FALSE;. U" D3 O4 o* j: u# V& D
    stcTim3BaseCfg.enGateP    = Tim3GatePositive;
+ P/ h6 N+ y% u5 F6 ?; F3 A    ( X# m) ]' R+ C) y
    Tim3_Mode0_Init(&stcTim3BaseCfg);             //TIM3 的模式0功能初始化# g" Q4 K% \" ~. t, d  Y
        , Y0 Y3 L" O! J5 }
    u32PclkValue = Sysctrl_GetPClkFreq();          //獲取Pclk的值" l3 g) U( ^# K+ K* |; t7 D3 t
   //u16ArrValue = 65535-(u32PclkValue/1000);      //1ms測試
3 V6 W. m/ }  T& L3 o    u16ArrValue = 65536 - (uint16_t)((float)(Frame_Spacing*10)/RS485_BAUDRATE*u32PclkValue);//根據(jù)幀間隔計(jì)算超時(shí)時(shí)間
/ ]0 y, `2 ?6 [    Time3_CntValue = u16ArrValue;             //計(jì)數(shù)初值
! q& w. q, [2 Z* w    Tim3_M0_ARRSet(u16ArrValue);              //設(shè)置重載值2 Z' v" c$ H3 B; C/ y# o6 D0 ]
    Tim3_M0_Cnt16Set(u16ArrValue);            //設(shè)置計(jì)數(shù)初值1 Q" g- U) Q0 M$ h. x
      M# W( F. G, v( m4 n5 O3 _- w
    Tim3_ClearIntFlag(Tim3UevIrq);            //清中斷標(biāo)志
+ T" y/ {& X8 p    Tim3_Mode0_EnableIrq();                   //使能TIM3中斷(模式0時(shí)只有一個(gè)中斷)
. X1 T+ U9 _. p: t; ^" o1 a    EnableNvic(TIM3_IRQn, IrqLevel3, TRUE);   //TIM3 開中斷  # u) j% T# f  ]& F& F6 n
}
9 Y9 ?  H9 N, V& u) H
) l6 L; a8 @" ]6 l/ Y5 R( z/**************************此處省略串口初始化部分************************/
& ~! b" T9 T! c7 `: z. N9 E5 ^' ?9 U//串口0中斷服務(wù)函數(shù)
2 _# q# A# c0 N1 y0 d7 h$ qvoid Uart0_IRQHandler(void)8 n+ j- P% K/ L1 K6 q  Q$ L, Z# `! \
{
# n5 ?# F6 a: K, z. i  v4 X3 V8 u    uint8_t rec_data=0;$ \5 D  S- ?  o2 j6 Y  r
   
) G3 Q- O" X8 K# k8 u    if(Uart_GetStatus(M0P_UART0, UartRC))         
1 w) e4 R* A4 O    {
. n3 o. P; y- g) r" G        Uart_ClrStatus(M0P_UART0, UartRC);          l9 n- B: x4 w; }( W
        rec_data = Uart_ReceiveData(M0P_UART0);     5 \% c% \8 o4 q1 c5 ^# p. a  g
        if(Uart0_Rec_Count[U]//幀長度
  C) }, \/ f, T$ f) N! e7 b0 l        {
' `  I& ~1 I, s) z5 r6 T) [            Uart0_Rec_Buffer[Uart0_Rec_Count++] = rec_data;        
- ]7 O3 ~/ O  a1 M0 p        }$ h( Q/ B( L. Z6 q2 p6 k% [
        Tim3_M0_Cnt16Set(Time3_CntValue);//設(shè)置計(jì)數(shù)初值
; x3 G& w! j, H2 L6 u2 _        Tim3_M0_Run();   //開啟定時(shí)器3 超時(shí)即認(rèn)為一幀接收完成  [$ Z- k, @1 _8 L9 l
    }. d9 d" S: ~+ X6 G6 u- c
}例程所用的是華大的hc32l130系列mcu,其它類型的mcu也可以參考這種寫法。其中超時(shí)時(shí)間的計(jì)算尤其要注意數(shù)據(jù)類型的問題,u16ArrValue = 65536 - (uint16_t)((float)(Frame_Spacing * 10)/RS485_BAUDRATE * u32PclkValue);其中Frame_Spacing為用戶設(shè)置的字符個(gè)數(shù),uart模式為一個(gè)“1+8+1”共10bits。
: A. }( ]5 }( T& K$ d2 A# k% ~: d狀態(tài)機(jī)斷幀狀態(tài)機(jī),狀態(tài)機(jī),又是狀態(tài)機(jī),沒辦法!誰讓它使用起來方便呢?其實(shí)這種方法我用的也不多,但是狀態(tài)機(jī)的思想還是要有的,很多邏輯用狀態(tài)機(jī)梳理起來會(huì)更加的清晰。! e; c  F% T" ^' Y" X
相對于超時(shí)斷幀,狀態(tài)機(jī)斷幀的方法節(jié)約了一個(gè)定時(shí)器資源,一般的mcu外設(shè)資源是足夠的,但是做一些資源冗余也未嘗不是一件好事,萬一呢?對吧。3 c. z. Z, b% k3 M
//狀態(tài)機(jī)斷幀) O. e, F: |' C1 ?" E$ s
void UART_IRQHandler(void)  //作為485的接收中斷  ?: q* A( H( _2 p1 }  H
{
* l# q; x9 o/ X% X# R' e    uint8_t count = 0;
6 \* y2 I" t% D* A    unsigned char lRecDat = 0; ; \4 z3 V7 h1 i, I4 H( g5 ^6 {
9 N# t; K  Q. L3 W; y# y
    if(/*觸發(fā)接收中斷標(biāo)志*/)  
% }, H7 @+ q  j- i    {9 B. D' ~3 B' z0 `( l  |* v3 i( [
        //清中斷狀態(tài)位
$ o: K& F4 E2 l, \3 j5 ~        rec_timeout = 5;
7 P( A/ P/ d0 V+ V" U4 x( C        if((count == 0)) //接收數(shù)據(jù)頭,長度可以自定義
% l+ r+ H" w$ l& e0 `        {
; w9 B4 R$ I  Z7 p6 `7 j- v            RUart0485_DataC[count++] = /*串口接收到的數(shù)據(jù)*/;
# u% M2 c+ G* ]5 y0 P4 r            gRecStartFlag = 1;
2 h, Y& n+ p! U/ O  Y            return;; c- Q2 m+ [' X- ~: K- }4 @
        }2 Z  V. t9 k' f( w9 H2 n
        if(gRecStartFlag == 1)
( ]) R* r7 O8 i$ n/ b( [% X        {' k. B! g8 \. B5 o
            RUart0485_DataC[count++] = /*串口接收到的數(shù)據(jù)*/;
1 o2 L$ |0 s9 h% J        ' v" t+ N5 ^# f& {
            if(count > MAXLEN) //一幀數(shù)據(jù)接收完成
/ h. F3 r- ~4 ?1 A. I  s            {
/ u: t+ R+ u% X1 F6 X5 T, p                count=0;. s; u& F$ Z9 X+ K0 @- [) U1 I
                gRecStartFlag = 0;
% i  g/ Q% }) C/ T                  t3 k3 A7 O  `2 ~3 b3 A" Y
                if(RUart0485_DataC[MAXLEN]==CRC16(RUart0485_DataC,MAXLEN))9 m! M. v6 y6 F2 p% n: ^+ m1 r( X
                {% B  v4 X9 {7 g" l" Q1 ?
                    memcpy(&gRecFinshData,RUart0485_DataC,13);
* F" x# d* v/ q9 K# z6 F$ C                    gRcvFlag = 1; //接收完成標(biāo)志位                    
" J" S$ w" F. }" @- A                }
8 z! J* _0 e. x' u! d( ?5 q            }   
1 H8 a! s  d2 y* y0 N        }
, f( R: @6 C& @4 T        return; . D/ O$ P) O- h: O  K" k* m
    }4 \8 K. D, F' j6 H9 P& k% v% w
    return ;; E# `/ g# x5 z
}這種做法適合用在一直有數(shù)據(jù)接收的場合,每次接收完一幀有效數(shù)據(jù)后就把數(shù)據(jù)放到緩沖區(qū)中去解析,同時(shí)還不影響下一幀數(shù)據(jù)的接收。8 _! y' r) V. ]' E3 Q- V
整個(gè)接收狀態(tài)分為兩個(gè)狀態(tài)——接收數(shù)據(jù)頭和接收數(shù)據(jù)塊,如果一幀數(shù)據(jù)存在多個(gè)部分的話還可以在此基礎(chǔ)上再增加幾種狀態(tài),這樣不僅可以提高數(shù)據(jù)接收的實(shí)時(shí)性,還能夠隨時(shí)看到數(shù)據(jù)接收到哪一部分,還是比較實(shí)用的。/ L& b) V; n4 l) s6 z. O) ~5 ~
"狀態(tài)機(jī)+FIFO"斷幀記得剛畢業(yè)面試的時(shí)候,面試官還問過我一個(gè)問題:如果串口有大量數(shù)據(jù)要接收,同時(shí)又沒有空閑幀中斷你會(huì)怎么做?
# ^! v( y2 B7 p1 j$ w9 o沒錯(cuò),就是FIFO(當(dāng)時(shí)并沒有回答上來,因?yàn)闆]用過),說白了就是開辟一個(gè)緩沖區(qū),每次接收到的數(shù)據(jù)都放到這個(gè)緩沖區(qū)里,同時(shí)記錄數(shù)據(jù)在緩沖區(qū)中的位置,當(dāng)數(shù)據(jù)到達(dá)要求的長度的時(shí)候再把數(shù)據(jù)取出來,然后放到狀態(tài)機(jī)中去解析。當(dāng)然FIFO的使用場合有很多,很多數(shù)據(jù)處理都可以用FIFO去做,有興趣的可以多去了解一下。/********************串口初始化省略,華大mcu hc32l130******************/, W$ A0 X6 e! S, P3 c) z% ~# G9 p
void Uart1_IRQHandler(void)
- A: E! F' A( p8 R# z{% F  V6 `- _) O" P  s" U
    uint8_t data;% e" s- c3 O/ A: c: c7 h" x
    if(Uart_GetStatus(M0P_UART1, UartRC))      //UART0數(shù)據(jù)接收
6 q; \8 s* C( [    {
; F8 D5 Z2 \) }        Uart_ClrStatus(M0P_UART1, UartRC);    //清中斷狀態(tài)位0 E( w% b$ q# M6 v! u
        data = Uart_ReceiveData(M0P_UART1);   //接收數(shù)據(jù)字節(jié)7 B; }4 X6 Y+ h2 [3 k* l4 |9 `
        comFIFO(&data,1);* w# Z, q: x) G% `; i, i
    }
% U8 R8 D+ E; h1 f. U; @  d" |3 t}' e: i% x3 V5 [7 S) A& g9 U, q5 P- z
2 G( G6 V% l- A( v4 o: p* m
/******************************FIFO*******************************/9 g8 n1 C$ z+ K7 \
volatile uint8_t     fifodata[FIFOLEN],fifoempty,fifofull;
% R  c+ a9 M6 M/ o/ U( Fvolatile uint8_t     uart_datatemp=0;8 M( N! j; U- Q
* v; M7 t# U  Q2 `  v8 A% Q
uint8_t comFIFO(uint8_t *data,uint8_t cmd)( ^7 c# ?9 R0 G( I: g3 q, l7 L6 E
{
" [  u, b# ]9 a6 X5 b1 j    static uint8_t rpos=0;  //當(dāng)前寫的位置 position 0--99
+ W) I2 [  {9 [8 @* G    static uint8_t wpos=0; //當(dāng)前讀的位置1 d% Z: O  Q$ q( |3 A1 A9 }

! p( c9 d0 f% v  s6 N+ S' v    if(cmd==0) //寫數(shù)據(jù)
4 j; D  U4 G4 i    {
( `  C( [' r5 h" G        if(fifoempty!=0)       //1 表示有數(shù)據(jù) 不為空,0表示空
0 R. w8 S1 o) u$ F) O$ g+ D        {1 q) a" C8 y" M' S. w% m
            *data=fifodata[rpos];
' D& o7 K. j% Y+ }- A  b$ v7 ^9 `            fifofull=0;% M3 n9 {' a$ G! w2 q
            rpos++;
. \. H- ?' K  f  Z  F/ i            if(rpos==FIFOLEN) 0 a9 i% o( c8 y3 c6 R& {( g# ^( w5 p
                rpos=0;
0 @: C, E8 |9 c- \            if(rpos==wpos)
3 g8 P( |. n1 \/ A( Q# v                fifoempty=0;/ K- Q3 s: a1 X! X2 T6 D6 e
            return 0x01;( K* m1 a# c! z7 ^7 ^5 o/ G
        }
" k. v) K! q0 ]0 C; `- y( {        else; v6 q0 x; J4 [8 I
            return 0x00;$ v8 n  D1 g: y; @) T
7 c8 ]9 a  q; {
    }
: ]8 U8 ?# }4 B% \- a. |0 ^    else if(cmd==1) //讀數(shù)據(jù)' L9 L7 g6 x0 |( D$ r7 B6 u) d
    {5 e$ X) c: M" o7 ?5 q: n
        if(fifofull==0)
. n! M& t$ V! l( x        {+ l4 f# M& s: Z* k& Y: Q
            fifodata[wpos]=*data;4 v9 s7 U/ Y. }. c% j
            fifoempty=1;, J1 B9 D& x3 g9 i1 M( D; g
            wpos++;
# v. F2 {, Z0 l& `' K            if(wpos==FIFOLEN) # x# X; t" f3 L* k# F
                wpos=0;7 \( \3 z: Y/ |& ^( }) c8 M7 U
            if(wpos==rpos) " z( y  A  Y2 ?1 W2 _
                fifofull=1;
: s1 Q4 g* s2 W6 E            return 0x01;
+ N. f8 E  M7 j* Y9 M2 j8 D4 S6 G        } else9 [% T/ \- l5 k: R7 ?2 L5 b
            return 0x00;5 Y( V0 D& G" D
    }/ j9 ?& |5 k8 E1 i
    return 0x02;- [' z  P1 ?! v3 F
}0 z: p5 y0 e  L4 l% ?, q* d
+ ^0 Z3 j' b6 T% W2 u
/********************************狀態(tài)機(jī)處理*******************************/
) W0 B" D' Y4 t) a8 E( m  [void LoopFor485ReadCom(void)! V2 t' H4 v7 G+ E
{
$ T( R( b. w, }0 N, h& L    uint8_t data;" R# l* b( o5 S7 G6 a1 R% ?& ~

( ?$ [4 a3 c5 R: n! y- H) S    while(comFIFO(&data,0)==0x01). T0 ?! g) r8 ^
    {
* u, O: s" K& e* ~3 l8 ^        if(rEadFlag==SAVE_HEADER_STATUS) //讀取頭
2 c# W) o% }" G7 @        {/ p  C' F* R3 d) z
            if(data==Header_H)- Z: o! q5 J8 @! t- A0 `# @' c
            {. b, x6 c6 b5 H* z. ]3 o7 v
                buffread[0]=data;  l$ p# J) m, z* t# T- W' v
                continue;3 a, B4 \# h8 h2 u. k8 t
            }
! }/ P) W9 p, d+ b. G- e$ A: z9 G  j            if(data==Header_L)2 e: O1 i* w$ M7 G$ {. |
            {6 j$ y1 ]- e9 }' G/ U8 G3 w4 G
                buffread[1]=data;% f4 u% m7 F3 ~; f0 M# |0 `. w8 N
                if(buffread[0]==Header_H); {) Q" U* E- e' K' A% ]# a- J* R  n
                {; ]9 _2 y# i* E& d+ v& _
                    rEadFlag=SAVE_DATA_STATUS;" d- H$ J* L2 X( t1 c7 @( K1 z
                }
) {& ?/ |* H' t, P- ~) p, r' o7 g            }
7 w5 u0 @& d' c2 u            else
; N" i' q8 ]6 Z: J" a8 ?9 X            {
& D3 c0 y0 A0 ^5 i                memset(buffread,0,Length_Data);
2 R" l1 {9 N1 @$ ~. K            }
3 G# g6 y& z) c# _2 w5 S% Z7 A# b( P        } 5 k! M% d  c4 p  p; k( X& M( C
        else if(rEadFlag==SAVE_DATA_STATUS)  //讀取數(shù)據(jù)
3 V' R( [3 ?, h# p0 L        {
) a+ W( ]" C6 F) D$ A$ ^& ]7 c            buffread[i485+2]=data;
% w; i. ^1 m* \- B7 y# n            i485++;. d9 I8 N% w1 v4 _* l1 M; Y
            if(i485==(Length_Data-2)) //數(shù)據(jù)幀除去頭
! B0 l4 ]" {3 F+ c9 e7 ^6 H            {, {' Y. V8 [6 a/ G" Z
                unsigned short crc16=CRC16_MODBUS(buffread,Length_Data-2);
2 F7 M% d7 L: }* l                if((buffread[Length_Data-2]==(crc16>>8))&&(buffread[Length_Data-1]==(crc16&0xff))). _9 V( Q+ U% ~4 H$ Y2 c
                {
0 J/ V. x, ]$ i, V                    rEadFlag=SAVE_OVER_STATUS;
! b- Q6 G) W- e                    memcpy(&cmddata,buffread,Length_Data);  //拷貝Length_Struct個(gè)字節(jié),完整的結(jié)構(gòu)體
! x: j1 F3 z3 S/ }6 i7 s                } . W0 r3 T# q9 L' E6 ~
                else) [1 L  }; ~/ k4 @! v' M) m
                {
! J5 Y, t6 r7 e5 {! a3 f                    rEadFlag=SAVE_HEADER_STATUS;, Y/ r8 Q' X6 ~  b# x  W$ I7 ]
                }( p; N, L9 O; j& _) o4 V
        $ W9 ]: e) Z; t3 ?" m; _4 k
                memset(buffread,0,Length_Data);. p6 ~+ Z( D$ }9 n# T
                i485=0;
4 r# ~+ c9 K1 T$ r5 ^. F                break;
/ l$ D: F+ h6 Z+ Y3 \; ~2 ?4 o. _& I            }
- ?* n( D% Q+ T% Q8 T        }
& ~9 y9 ]: K- n, j. f4 B    }
, Q3 r' {6 c6 E3 g6 `0 A! N}原文:https://blog.csdn.net/qq_56527127/article/details/123018515
9 Y( P3 m8 K# g: ~+ f4 C. ` & B* Y& Z+ J5 m' h7 K. S4 m
-END-+ V6 y3 h6 K4 G- ?+ ~
往期推薦:點(diǎn)擊圖片即可跳轉(zhuǎn)閱讀  q6 g5 n$ f( e- @, h& N; R/ W

% k. C! \7 g, F6 V/ a3 k                                                        % ]* h0 R9 Y. V$ C. {& m
                                                               
" A' q+ h: W1 e7 ~6 E/ e                                                                       
' C* R+ H3 y" y5 p! i- e9 P9 F* |5 r                                                                               
) ]& {6 L/ c9 c2 M" A % x- Q, Q: \/ ~. Q- |  w; \
                                                                                , T6 m6 Z4 G' F0 [" S2 p
                                                                                        嵌入式軟件調(diào)試,如何計(jì)算任務(wù)的運(yùn)行周期?
8 L" ]1 _1 x' X+ Q5 ?                                                                               
% [$ `& e# w$ y, p) U+ Y                                                                        3 |/ K/ P' \# z7 f
                                                               
: L2 W! B# G& L$ k9 P                                                        2 f) _. _+ w" _3 b& ~
                                                $ @5 M. D3 l: _( ~  F. S& s# i
4 t, S$ O& v$ W* p7 C
                                                        4 B! l  }6 J+ i8 d) t% Z* u
                                                               
; E( i/ h7 x9 Q) K# p                                                                       
% e: C3 f% v/ ^: k                                                                               
9 J2 i! l3 r: d" o& h) l ; n  R/ q# H, e$ l
                                                                                ' H: h: |- Y( P
                                                                                        嵌入式軟件,如何把編譯時(shí)間加入到bin文件,進(jìn)行版本管理?/ J+ P" b( n  K& h6 i5 h8 _2 f
                                                                               
# j. N5 e5 q! q- x* m                                                                        7 L* o( b' t4 O' |  M/ S
                                                                9 J6 ]. m7 P( t( H. `
                                                       
% V- @6 y. `3 P                                                9 ]( Y" I& A! \, w& `# K

6 Q& a* J- t  a/ k( U& b$ o( o                                                       
( I$ ?6 z9 G4 v) Y2 l7 }                                                                ' `, z. @. w" h: n
                                                                       
9 a) O& S, {# A$ E                                                                               
) I% @% W; g8 U / x( P) Q! f/ I! ^- H, p5 e
                                                                                ; l. v) U. [% f" c
                                                                                        嵌入式初學(xué)者入門后,應(yīng)該如何開始進(jìn)階學(xué)習(xí)?
; L- u: o3 ~5 b, @3 D- X                                                                                ( [0 D) B2 n) I# y4 b6 q1 n
                                                                        - s# D% a9 Y/ q6 Z
                                                                / R$ l5 d6 c( C  o
                                                       
6 g  G1 g( _4 k( v( h                                               
0 i# C% Y! k6 a% Z% |; _3 s: k我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師
& l2 F8 \0 f0 A# |0 a* h: ]) `關(guān)注我,一起變得更加優(yōu)秀!

發(fā)表回復(fù)

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

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表