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

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

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

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

[復(fù)制鏈接]

485

主題

485

帖子

1623

積分

三級(jí)會(huì)員

Rank: 3Rank: 3

積分
1623
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-12-1 17:50:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師# u, }6 y% {. j  d1 A7 c
關(guān)注我,一起變得更加優(yōu)秀!說(shuō)起通信,首先想到的肯定是串口,日常中232和485的使用比比皆是,數(shù)據(jù)的發(fā)送、接收是串口通信最基礎(chǔ)的內(nèi)容。這篇文章主要討論串口接收數(shù)據(jù)的斷幀操作?臻e中斷斷幀一些mcu(如:stm32f103)在出廠時(shí)就已經(jīng)在串口中封裝好了一種中斷——空閑幀中斷,用戶可以通過(guò)獲取該中斷標(biāo)志位來(lái)判斷數(shù)據(jù)是否接收完成,中斷標(biāo)志在中斷服務(wù)函數(shù)中獲取,使用起來(lái)相對(duì)簡(jiǎn)單。void UART4_IRQHandler(void)5 b" \2 ~) B, O  j4 U
{% d& O# y( f! o& F
    uint8_t data = 0;
" Q& c- d" C* z1 Y* C- S    data = data;
# \0 _3 f+ y* L2 B    if(USART_GetITStatus(LoraUSARTx, USART_IT_RXNE) == SET)6 X# t" G5 I7 A0 n! ~0 t
    {
3 e+ ^" q2 {! r5 R2 c        USART_ClearITPendingBit(LoraUSARTx, USART_IT_RXNE);# ]7 l( p# Q8 O8 K9 S
        if(Lora_RecvData.Rx_over == 0)6 l: l6 }2 N3 ]  q3 p* [
            Lora_RecvData.RxBuf[Lora_RecvData.Rx_count++] = LoraUSARTx->DR;
6 f# p" t% j- o5 B5 c    }, a# z; L5 R% N& K+ j3 G2 ~
    if(USART_GetITStatus(LoraUSARTx, USART_IT_IDLE) == SET)( J7 B! ^; E& [  \3 b, c
    {: `+ i7 [; Q" [: B
        data = LoraUSARTx->SR;$ J: `& h, i* b& f
        data = LoraUSARTx->DR;
+ X5 u( y: F2 J2 P        
- ?. Y* M0 j" [6 P. s        Lora_RecvData.Rx_over = 1; //接收完成1 P$ E6 Q7 {) Q. w- y* E4 a
    }. O9 C. c7 L! q. b( }
}例程中,當(dāng)接收完成標(biāo)志 Lora_RecvData.Rx_over 為1時(shí),就可以獲取 uart4 接收到的一幀數(shù)據(jù),該數(shù)據(jù)存放在 Lora_RecvData.RxBuf 中。9 |3 h1 |5 H( L
超時(shí)斷幀空閑幀中斷的使用固然方便,但是并不是每個(gè)mcu都有這種中斷存在(只有個(gè)別高端mcu才有),那么這個(gè)時(shí)候就可以考慮使用超時(shí)斷幀了。, C, d# I6 f7 K5 y. {% d% a
Modbus協(xié)議中規(guī)定一幀數(shù)據(jù)的結(jié)束標(biāo)志為3.5個(gè)字符時(shí)長(zhǎng),那么同樣的可以把這種斷幀方式類比到串口的接收上,這種方法需要搭配定時(shí)器使用。
; d: D0 T* K+ U- g0 O% }其作用原理就是:串口進(jìn)一次接收中斷,就打開定時(shí)器超時(shí)中斷,同時(shí)裝載值清零(具體的裝載值可以自行定義),只要觸發(fā)了定時(shí)器的超時(shí)中斷,說(shuō)明在用戶規(guī)定的時(shí)間間隔內(nèi)串口接收中斷里沒(méi)有新的數(shù)據(jù)進(jìn)來(lái),可以認(rèn)為數(shù)據(jù)接收完成。% G( h0 x" g) }$ f: m! E! i
uint16_t Time3_CntValue = 0;//計(jì)數(shù)器初值& z7 A8 c* o3 m, I4 R% U

% o! A4 L5 l* G- @5 g1 q9 g/*******************************************************************************
  \0 S& s% `8 ?$ ^9 N2 \8 _8 L * TIM3中斷服務(wù)函數(shù)& X/ @, \- M9 e' Q0 b* T
******************************************************************************/
4 `( L# J/ a7 |void Tim3_IRQHandler(void)
3 w4 j! U: J$ S{/ N  N+ ?, u6 Q' L4 Y/ W" a5 b
    if(TRUE == Tim3_GetIntFlag(Tim3UevIrq))
' Y# p! c1 X  b9 x- x    {
- g. z4 V: }+ S% r        Tim3_M0_Stop();    //關(guān)閉定時(shí)器3
, D% H1 ^0 p+ p: f& J4 d        Uart0_Rec_Count = 0;//接收計(jì)數(shù)清零0 l) T5 ^, R% Q: t: w
        Uart0_Rec_Flag = 1; //接收完成標(biāo)志& r# [, Z/ \$ [8 m$ Y* Q" _) f
        Tim3_ClearIntFlag(Tim3UevIrq); //清除定時(shí)器中斷
' y2 u+ ^3 c/ ^9 f' O3 |- ?    }* D7 N- s3 g3 a8 ^7 k  C# E
}
, X9 s6 a# ~3 J0 f& e2 L! Q1 }1 a 2 ~7 s! e9 z. H, Z" E
void Time3_Init(uint16_t Frame_Spacing)- i; O% G$ T% [. m2 c
{
$ ?) u" j# |. i7 Y2 e7 D7 o    uint16_t u16ArrValue;//自動(dòng)重載值, v6 O7 ]2 e$ c" t
    uint32_t u32PclkValue;//PCLK頻率' f8 L1 H" I6 B8 l2 }
    ) @& q  z: N1 C8 _, Q' Y5 j. s9 h# i
    stc_tim3_mode0_cfg_t     stcTim3BaseCfg;
6 |# J- _8 x  n$ `2 d7 R   
6 V% A% m1 `3 ?% Q    //結(jié)構(gòu)體初始化清零
' H, B4 P/ A+ C! y* |5 O! u7 u    DDL_ZERO_STRUCT(stcTim3BaseCfg);* C! \. g3 v$ O5 u* ~, K. \
   
- H7 W! Z2 x5 p5 s8 m2 k! m0 X    Sysctrl_SetPeripheralGate(SysctrlPeripheralTim3, TRUE); //Base Timer外設(shè)時(shí)鐘使能
9 [- g9 A1 `( n; p8 I( _    $ @- M6 H# d1 ^7 I3 W* R
    stcTim3BaseCfg.enWorkMode = Tim3WorkMode0;              //定時(shí)器模式6 H/ L) D8 C4 m# w
    stcTim3BaseCfg.enCT       = Tim3Timer;                  //定時(shí)器功能,計(jì)數(shù)時(shí)鐘為內(nèi)部PCLK. R" v' F- N$ [3 P3 i7 N
    stcTim3BaseCfg.enPRS      = Tim3PCLKDiv1;               //不分頻5 W0 u7 n. B( h* r- \
    stcTim3BaseCfg.enCntMode  = Tim316bitArrMode;           //自動(dòng)重載16位計(jì)數(shù)器/定時(shí)器
$ N4 E1 B0 c6 i# F    stcTim3BaseCfg.bEnTog     = FALSE;
# ^2 c, ^% Z# `    stcTim3BaseCfg.bEnGate    = FALSE;1 A4 d1 |0 C" x9 V
    stcTim3BaseCfg.enGateP    = Tim3GatePositive;
; j; z/ n. j$ t/ i8 u$ l* b    ; W, Z; b! y9 ?( {) |. p1 Z/ b6 H
    Tim3_Mode0_Init(&stcTim3BaseCfg);             //TIM3 的模式0功能初始化! O8 N6 T% a/ _( |" {; ?! {  P1 S) D; h2 s
        5 b7 V: i' i8 p7 Y6 Y: h" k
    u32PclkValue = Sysctrl_GetPClkFreq();          //獲取Pclk的值
: i/ R2 s: Z. t- }7 [   //u16ArrValue = 65535-(u32PclkValue/1000);      //1ms測(cè)試
) H/ [; z1 j8 U* y, D6 n: V" W0 L2 g    u16ArrValue = 65536 - (uint16_t)((float)(Frame_Spacing*10)/RS485_BAUDRATE*u32PclkValue);//根據(jù)幀間隔計(jì)算超時(shí)時(shí)間4 I  T1 ^, x3 [2 k  P& F
    Time3_CntValue = u16ArrValue;             //計(jì)數(shù)初值: f9 l4 m9 l7 `4 y
    Tim3_M0_ARRSet(u16ArrValue);              //設(shè)置重載值$ e% o% d% S( t0 b, |, U% N
    Tim3_M0_Cnt16Set(u16ArrValue);            //設(shè)置計(jì)數(shù)初值. H0 y% x: q; |2 q
    4 p) }7 q; O5 F' r; V
    Tim3_ClearIntFlag(Tim3UevIrq);            //清中斷標(biāo)志3 W2 h. I& a: q3 X1 |: }- O, g
    Tim3_Mode0_EnableIrq();                   //使能TIM3中斷(模式0時(shí)只有一個(gè)中斷)
1 C: e7 v* \6 h. c8 ?, B  r0 Y2 H    EnableNvic(TIM3_IRQn, IrqLevel3, TRUE);   //TIM3 開中斷  
/ ?( w) p% K/ `! B4 a} ! h# {9 W6 \3 g2 \9 _+ I' Y9 E

5 N& V" t( K9 c/**************************此處省略串口初始化部分************************/
7 I! J  m+ N: N: W//串口0中斷服務(wù)函數(shù)
5 j) L6 C% X1 |& Cvoid Uart0_IRQHandler(void)
1 o* V% A3 e( G: {: F) b$ S{
- z0 A- [$ e( {, `# t    uint8_t rec_data=0;
! Z! v( _: u- Y: s    7 }3 ^: `, h6 I! J2 u( j+ g
    if(Uart_GetStatus(M0P_UART0, UartRC))         
/ L2 k% |, [' Q2 N, J    {
% p1 @; T- f1 r0 Y) V& }        Uart_ClrStatus(M0P_UART0, UartRC);        
3 m( h7 I' i/ D        rec_data = Uart_ReceiveData(M0P_UART0);     9 [1 [% U* M; _& g. j! {
        if(Uart0_Rec_Count[U]//幀長(zhǎng)度, J, F% B4 n! a: j4 N4 c# W; M* C
        {
9 W8 u$ f7 {: x, F$ z5 V/ Z  M5 f' A6 H            Uart0_Rec_Buffer[Uart0_Rec_Count++] = rec_data;        
# A! O8 X% Q' a$ M        }
4 ]' F% z" H1 \4 v; f' w2 }  P; y        Tim3_M0_Cnt16Set(Time3_CntValue);//設(shè)置計(jì)數(shù)初值 2 f" ?& R9 f6 m7 U( @
        Tim3_M0_Run();   //開啟定時(shí)器3 超時(shí)即認(rèn)為一幀接收完成0 N# x4 p% _" r' Z. z' z
    }
7 K1 Q7 W5 [  F3 W& v$ r}例程所用的是華大的hc32l130系列mcu,其它類型的mcu也可以參考這種寫法。其中超時(shí)時(shí)間的計(jì)算尤其要注意數(shù)據(jù)類型的問(wèn)題,u16ArrValue = 65536 - (uint16_t)((float)(Frame_Spacing * 10)/RS485_BAUDRATE * u32PclkValue);其中Frame_Spacing為用戶設(shè)置的字符個(gè)數(shù),uart模式為一個(gè)“1+8+1”共10bits。
! U  {) F2 I3 p0 C: }狀態(tài)機(jī)斷幀狀態(tài)機(jī),狀態(tài)機(jī),又是狀態(tài)機(jī),沒(méi)辦法!誰(shuí)讓它使用起來(lái)方便呢?其實(shí)這種方法我用的也不多,但是狀態(tài)機(jī)的思想還是要有的,很多邏輯用狀態(tài)機(jī)梳理起來(lái)會(huì)更加的清晰。
" W) o1 _7 ~) N* Q相對(duì)于超時(shí)斷幀,狀態(tài)機(jī)斷幀的方法節(jié)約了一個(gè)定時(shí)器資源,一般的mcu外設(shè)資源是足夠的,但是做一些資源冗余也未嘗不是一件好事,萬(wàn)一呢?對(duì)吧。
3 P7 E* @! r9 u5 u! _//狀態(tài)機(jī)斷幀
1 f% Q3 \, S8 I8 Nvoid UART_IRQHandler(void)  //作為485的接收中斷
/ n8 C  R$ [1 [. ~7 r# F{/ i& f7 V5 f1 a7 \6 {  [
    uint8_t count = 0;  R' D9 O! M0 C, e
    unsigned char lRecDat = 0; $ U6 ]$ Y# K; \% t: Y8 N
8 P6 N( ^: H# d+ I4 [4 L( @: C
    if(/*觸發(fā)接收中斷標(biāo)志*/)  / ]- R* k1 P% x5 h% E; }
    {
$ @/ {6 S% ~0 {+ m! V        //清中斷狀態(tài)位6 l7 M' ]/ z, y0 n  }
        rec_timeout = 5;3 b* I; o! U' J$ T
        if((count == 0)) //接收數(shù)據(jù)頭,長(zhǎng)度可以自定義
; w2 R1 c, s' ^' r' W0 ?        {' g0 `9 K9 a% S9 E* c
            RUart0485_DataC[count++] = /*串口接收到的數(shù)據(jù)*/;
9 h" u3 M! y- t            gRecStartFlag = 1;
% B6 ~$ m! ~+ `+ A            return;
0 j( z+ M" r; W2 V' a" c* n        }
" t2 A; Z9 l2 }) W) G) f5 U" f3 p        if(gRecStartFlag == 1)
/ t8 A( z; `) A$ X7 `1 m  q" r        {
# S! E2 `5 u! U. K            RUart0485_DataC[count++] = /*串口接收到的數(shù)據(jù)*/;4 q( \) U* ^7 {
        " B7 d2 b: h+ S2 N$ l
            if(count > MAXLEN) //一幀數(shù)據(jù)接收完成3 e+ G9 q$ r  w- J, u9 V$ m6 P
            {
( _% M5 T* C9 q/ O                count=0;
6 e0 J( ]4 r/ B. M4 [                gRecStartFlag = 0;
  S/ A: R. z/ O                & f# q# M, c9 i% D8 m2 }' K
                if(RUart0485_DataC[MAXLEN]==CRC16(RUart0485_DataC,MAXLEN))
( c/ D2 {- L; o                {
2 h8 Y5 y* B# c                    memcpy(&gRecFinshData,RUart0485_DataC,13);
' E! v$ Q( w9 H1 i8 C1 _7 D, `                    gRcvFlag = 1; //接收完成標(biāo)志位                    5 V" Y; _- G# Z! P. ]4 S
                }0 y! J0 W7 [4 b5 F
            }   
8 t0 ^! C( N7 c) k# r" x        }1 ]+ i' u/ }/ y" b) \; c  p6 \0 [) D
        return; + H& `) f2 I  T" d
    }6 ]& j+ ~8 a7 ~1 d
    return ;7 o4 Q* `( |* u( Q9 d5 I& c
}這種做法適合用在一直有數(shù)據(jù)接收的場(chǎng)合,每次接收完一幀有效數(shù)據(jù)后就把數(shù)據(jù)放到緩沖區(qū)中去解析,同時(shí)還不影響下一幀數(shù)據(jù)的接收。
1 |0 j3 t. P* A1 \% y2 x整個(gè)接收狀態(tài)分為兩個(gè)狀態(tài)——接收數(shù)據(jù)頭和接收數(shù)據(jù)塊,如果一幀數(shù)據(jù)存在多個(gè)部分的話還可以在此基礎(chǔ)上再增加幾種狀態(tài),這樣不僅可以提高數(shù)據(jù)接收的實(shí)時(shí)性,還能夠隨時(shí)看到數(shù)據(jù)接收到哪一部分,還是比較實(shí)用的。
6 E+ Z% G; \; G. o"狀態(tài)機(jī)+FIFO"斷幀記得剛畢業(yè)面試的時(shí)候,面試官還問(wèn)過(guò)我一個(gè)問(wèn)題:如果串口有大量數(shù)據(jù)要接收,同時(shí)又沒(méi)有空閑幀中斷你會(huì)怎么做?6 Y5 ?; H9 d: X- E9 E) ~  Q
沒(méi)錯(cuò),就是FIFO(當(dāng)時(shí)并沒(méi)有回答上來(lái),因?yàn)闆](méi)用過(guò)),說(shuō)白了就是開辟一個(gè)緩沖區(qū),每次接收到的數(shù)據(jù)都放到這個(gè)緩沖區(qū)里,同時(shí)記錄數(shù)據(jù)在緩沖區(qū)中的位置,當(dāng)數(shù)據(jù)到達(dá)要求的長(zhǎng)度的時(shí)候再把數(shù)據(jù)取出來(lái),然后放到狀態(tài)機(jī)中去解析。當(dāng)然FIFO的使用場(chǎng)合有很多,很多數(shù)據(jù)處理都可以用FIFO去做,有興趣的可以多去了解一下。/********************串口初始化省略,華大mcu hc32l130******************/
( R1 [5 f6 u5 N2 svoid Uart1_IRQHandler(void)
3 \% i4 A0 `* s+ z/ l{
! R0 G% F5 R$ u/ u; N# i  N' s    uint8_t data;1 }1 H1 Y! ?. G
    if(Uart_GetStatus(M0P_UART1, UartRC))      //UART0數(shù)據(jù)接收
7 P, W3 T! |4 ^    {
* D  ]* M7 C+ d" D3 b% H3 k$ O; k6 ~        Uart_ClrStatus(M0P_UART1, UartRC);    //清中斷狀態(tài)位% s3 b+ R$ r9 D
        data = Uart_ReceiveData(M0P_UART1);   //接收數(shù)據(jù)字節(jié)
% n0 L4 l4 o8 u        comFIFO(&data,1);
: y5 V9 j# b& ^/ m3 l    }
. [: b& v3 C6 p+ J}! B! f; N' a7 F7 @$ W
! \. w6 y' P. k, ]
/******************************FIFO*******************************/
9 v# s3 p! t( H3 ?2 u0 |volatile uint8_t     fifodata[FIFOLEN],fifoempty,fifofull;2 Q. \8 p# x9 j* z, @+ L8 g
volatile uint8_t     uart_datatemp=0;
) v& \' q$ T* I  D
$ W( |% t# P6 t/ F6 Ouint8_t comFIFO(uint8_t *data,uint8_t cmd)& a4 @* Y" @* {1 O! B/ F
{0 [7 ]2 f) R6 s3 c+ o( i+ C
    static uint8_t rpos=0;  //當(dāng)前寫的位置 position 0--99 + T& ^  B. \- U8 v+ }: m  f- H
    static uint8_t wpos=0; //當(dāng)前讀的位置+ @; F, m% H/ x: k" L1 u9 K0 y
! {; |& b3 i' i( y) E& g2 k
    if(cmd==0) //寫數(shù)據(jù)
0 h, r9 j9 L( Y; P    {3 G& }0 M9 Q$ h# m3 `  ^5 o( ]
        if(fifoempty!=0)       //1 表示有數(shù)據(jù) 不為空,0表示空
4 s1 X+ O* W0 A* Y* s/ y        {2 p- D+ G; F, }. l" R4 B
            *data=fifodata[rpos];
' v7 e+ [& S: J0 c; H            fifofull=0;
5 S) L; w8 C% `! B* B            rpos++;
% Y. ^' F; U  Y6 f            if(rpos==FIFOLEN) : Y- `! ~/ T; N( D' f
                rpos=0;
/ c: B( e2 a, Z7 y            if(rpos==wpos)
' V0 _7 r' \$ A( W" e' Q% e" A                fifoempty=0;6 ?3 L6 o: n7 V7 ~' H% a
            return 0x01;/ X, L1 v5 J9 \6 M; Q9 P3 r9 B
        }
+ Y" ?- D. X; d1 K; ~% ]        else
" J& G( M, ~) M" L( X- }: H            return 0x00;, A% U1 S( k/ P. ]8 T

% k* W- O( f3 \: D+ [9 q    } 1 Y( k$ n" Y8 G
    else if(cmd==1) //讀數(shù)據(jù)1 V3 B5 ?" n2 N0 Y2 P9 D
    {* a6 v, h4 l' d, p# J
        if(fifofull==0)
6 c0 i. w/ @* b6 T" g        {
7 P0 |, Z* M& w4 B1 w- r3 L            fifodata[wpos]=*data;
3 s, k' U4 y  Y# ]# c: `. o            fifoempty=1;' g! X+ U5 C$ m% _( @) t' y( W' N: Q
            wpos++;' l/ U3 V1 @# ?$ D8 {. N
            if(wpos==FIFOLEN)
7 T5 O) M  i" C                wpos=0;
4 g& D, y# r8 U  I6 a3 h+ o- H4 d            if(wpos==rpos)
7 c/ o) n0 E) {! F; a% J                fifofull=1;
, Z! F9 c; F8 ~: ?; z# N! @3 |            return 0x01;
7 k2 Q# K5 L$ m# Y9 j" r% z# ]        } else5 p, l& D: c# [7 w
            return 0x00;
, v8 V8 t* x! S6 _! _# g1 a8 d3 k; e    }
3 U4 s& x  f5 \, g* |. }2 W0 r    return 0x02;
0 ~8 Q# J& I2 I}
  l+ U- z9 ?4 g
4 F( O& w. u* o, h2 I. h0 ^/********************************狀態(tài)機(jī)處理*******************************/
+ b" w8 x; x1 i" f+ jvoid LoopFor485ReadCom(void)$ e: Z+ I. b( Y" j: W! q
{4 w. |" r5 V& f' q8 r. l* T+ j6 J
    uint8_t data;
, q: {; O' L5 ^, o9 V
3 i* a9 a) i7 h0 J4 z    while(comFIFO(&data,0)==0x01)
0 S9 ^. t+ J8 Q) F' k& |3 Y    {
" [3 Y+ y/ ^1 _, u1 P: J0 O6 E        if(rEadFlag==SAVE_HEADER_STATUS) //讀取頭
! E8 I# D0 R4 T6 ~5 b. U        {$ w, s. A% V3 o
            if(data==Header_H)8 L5 f% r2 G. B6 g
            {% m* @  b6 n8 I0 `
                buffread[0]=data;
) T1 {) @( e9 N                continue;) a2 f" o+ ]( t7 ?" }
            }
' j) U8 E" ]- P2 {  M            if(data==Header_L)/ [# |( M/ z% D' S, c- T
            {
) R+ q2 }0 J" I& H; A/ u" x                buffread[1]=data;+ {! G4 C$ [; a4 p$ s
                if(buffread[0]==Header_H)8 F2 F9 ~' @* V. C6 `1 T4 {+ |
                {
) p0 j" j% ~; ?" p. W                    rEadFlag=SAVE_DATA_STATUS;
% V  x$ F. w# U6 ?/ v                }) n  ]' @/ `/ l
            }
/ b' r9 w0 U8 I5 U5 {            else
2 d8 r2 r5 D5 m$ r            {; d) F4 M+ x& l% d, Z" V1 X
                memset(buffread,0,Length_Data);# l9 j! h1 n  a: ?( w, y  ]
            }
! m  V0 [* z5 y" M        }
, U/ a# @2 l4 }. e9 n        else if(rEadFlag==SAVE_DATA_STATUS)  //讀取數(shù)據(jù)% h% Y" T( e; o, d4 o# N
        {
$ b: o- e; F9 e            buffread[i485+2]=data;6 Y* [4 Z8 S8 u# I! R
            i485++;
2 P! F. D# Z+ ?& o, E: ]8 i3 K            if(i485==(Length_Data-2)) //數(shù)據(jù)幀除去頭/ k: n4 J$ [/ ~# @" }
            {
1 f7 m& |8 o% N                unsigned short crc16=CRC16_MODBUS(buffread,Length_Data-2);
! e$ |9 d0 J- _# [. C; A                if((buffread[Length_Data-2]==(crc16>>8))&&(buffread[Length_Data-1]==(crc16&0xff)))/ `/ h+ ^8 W' c8 T7 J( ~
                {6 t) P& m6 d# \* n( d! H
                    rEadFlag=SAVE_OVER_STATUS;
) q% h0 y0 O1 _" p- e                    memcpy(&cmddata,buffread,Length_Data);  //拷貝Length_Struct個(gè)字節(jié),完整的結(jié)構(gòu)體
8 i% F! R- @$ q- y0 G                }
' j2 ^  o1 t* U" ?  {  B+ c                else
/ n. p2 M1 [+ p; e                {  o; ~( ]! U) A: `3 k% S# N0 U
                    rEadFlag=SAVE_HEADER_STATUS;
8 L. R3 b2 Z- r9 F5 Y2 C9 E                }1 W9 e" w, A# h* V; x
        / G, J2 x3 o1 V/ O
                memset(buffread,0,Length_Data);
7 W/ R) L; H; ~' ~8 j3 o4 b& l2 t                i485=0;" _" v0 w, e1 o( m
                break;
% P* {6 Q( @( S3 e- a# K            }! I: `) f  a  _  t
        }
( C( B3 }5 d8 `3 J    }$ ^- Y: R1 M3 K* |+ Q- ]( _3 a% k" O  H
}原文:https://blog.csdn.net/qq_56527127/article/details/123018515
5 i+ D) ]' }  ^/ a: a 7 _8 q+ t* a, S
-END-; z; z- b7 Q+ y# A( y" q
往期推薦:點(diǎn)擊圖片即可跳轉(zhuǎn)閱讀6 @( n+ X* k; t0 u
6 b& m5 [9 ?* L& M. g3 j
                                                       
' [8 d* L- c% i; K+ ]5 a' Z6 ~0 t+ E7 R                                                                ; ~' v/ ^5 J$ y7 M
                                                                        . }: p4 f. h( [7 D5 z
                                                                                5 v+ t. Z, r+ e
6 {  D/ `9 i) J9 s+ N7 V& `2 P
                                                                                ! G& L' l7 T1 L3 ?+ Y; }; e
                                                                                        嵌入式軟件調(diào)試,如何計(jì)算任務(wù)的運(yùn)行周期?
9 L0 J* x+ k, X0 Y% a                                                                               
" L4 D6 f/ T. ]                                                                       
: J5 X5 a8 I5 l& g. ~# \% v                                                                " j% C0 Q% r, t6 u/ r; V
                                                       
8 y8 j+ B4 I" \* u+ c0 l7 q: _% S                                                / y# G/ V' i0 r) O
. F% R  N. U3 z( t0 X
                                                       
3 W7 j6 O& Z  h" `                                                                : B: ?, S8 c4 S7 B! R- b; P- g3 D
                                                                        3 L+ y, t( b& X# h* W! n
                                                                                0 o% \& X) c1 s; s' u* d' H
  {1 _" j3 h/ k1 h+ e1 T
                                                                                  }3 n5 X/ a1 v/ U, \7 m) W7 l
                                                                                        嵌入式軟件,如何把編譯時(shí)間加入到bin文件,進(jìn)行版本管理?
/ t+ k' h: R7 z4 e3 Y9 c                                                                               
" U, H& [8 m9 }* i6 z$ T- L                                                                       
3 N3 g( u0 N) ~& `# l0 |                                                               
2 e6 F- J  O) u9 D. @                                                        . [2 d% e5 u6 M$ R
                                                ( u$ i& f# Q4 y( L; i$ l. A

" c" H6 ^0 m2 P, r2 ^9 s5 A                                                        + \6 n5 V3 C. i4 L8 y
                                                               
4 U' F; p' J6 u3 K. ]8 U, U5 H                                                                       
, ^, Y, h! N* ?1 T* [                                                                               
! ?* K5 k$ t, Y# v. P
3 ^6 u( |3 R  [+ m/ Y/ S                                                                                ! S1 [* I( F9 |2 X4 O( L
                                                                                        嵌入式初學(xué)者入門后,應(yīng)該如何開始進(jìn)階學(xué)習(xí)?$ [8 Q  p7 O6 _, T0 O7 c. D
                                                                               
) h* O( @. {- W+ I# s  }# P                                                                       
5 ~; }; S5 d  g. Z0 s0 g3 ~) W# A                                                               
  l) N1 Y6 p. }1 D" u/ _& S                                                       
7 Z" ?/ l4 f, m6 @# Z5 o/ L                                                9 j% V5 a9 n* b3 R  K* D/ c2 G
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師+ z% q& v4 V) ]" W( Z& t/ L' Y
關(guān)注我,一起變得更加優(yōu)秀!

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

本版積分規(guī)則


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