在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32串口接收不定長數據:采用標志位(比如0X0D,0X0A)結束法

RXL111 ? 來源:RXL111 ? 作者:RXL111 ? 2022-09-23 14:06 ? 次閱讀

缺點:有些情況下會導致數據丟失(可能返回數據中0x0d、0a本身為有效數據)
適用:約定協議的數據幀(發送數據的設備必須以相應的約定字節作為一次數據結束)


void USART1_IRQHandler(void)                	//串口中斷服務程序(函數)
	{
	u8 Res;	//定義Res,用于Res =USART_ReceiveData(USART1);中存儲串口1發送的數據(這里的數據按位發送)
#if SYSTEM_SUPPORT_OS  //如果SYSTEM_SUPPORT_OS為真,則需要支持OS		
	OSIntEnter();    
#endif
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中斷(接收到的數據必須是0x0d 0x0a結尾)
		{
		Res =USART_ReceiveData(USART1);	//讀取接收到的數據
		
		if((USART_RX_STA&0x8000)==0)//接收未完成    1000 0000 0000 0000
//判斷USART_RX_STA的第一位是否為0,這時因為USART_RX_STA的初始值為0,所以我們進入if(USART_RX_STA&0x4000)。
			{
			if(USART_RX_STA&0x4000)//接收到了0x0d	0100 0000 0000 0000
//判斷USART_RX_STA的第二位是否為1,所以我們進入else //還沒收到0X0D。
				{
				if(Res!=0x0a)USART_RX_STA=0;//接收錯誤,重新開始
				else USART_RX_STA|=0x8000;	//接收完成了 
				}
			else //還沒收到0X0D
				{	
				if(Res==0x0d)USART_RX_STA|=0x4000;//再次判斷這次接收到的是不是0x0d,判斷了Res是否0x0d, 即Res是否為回車,這里如果串口有輸入數據的話明顯可以判斷的,所以我們進入下面的else.
				else
					{
					USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;  // 0011 1111 1111 1111
					USART_RX_STA++;
					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收數據錯誤,重新開始接收	  
					}		 
				}
			}   		 
     } 
#if SYSTEM_SUPPORT_OS 	
	OSIntExit();  											 
#endif
}

OSIntEnter()和OSIntExit()兩者必須成對出現。
進入中斷時調用OSIntEnter(),退出中斷時調用OSIntExit()。
OSIntEnter 是進?中斷服務函數,?來記錄中斷嵌套層數(OSIntNesting增加 1);
OSIntEnter()應該在中斷關閉后調用,所以函數里面沒有使用OS_ENTER_CRITICAL() and OS_EXIT_CRITICAL(),如此在調用OSIntEnter()前需關閉中斷。
OSIntExit():所有中斷結束后進行任務調度,使系統更加實時。
OSIntExit 是退出中斷服務函數,該函數可能觸發?次任務切換(當 OSIntNesting==0&&調度器未上鎖&&就緒表最?優先級任務 != 被中斷的任務優先級時),否則繼續返回原來的任務執?代碼(如果 OSIntNesting 不為 0,則減 1)。
OS_Sched():uCOS進行任務調度,不在中斷調用。
OSIntNesting:統計中斷嵌套數,最多255。在OSIntExit()和OS_Sched()中都有判別。
OS_ENTER_CRITICAL():保存中斷狀態,關中斷。uCOS將無法再執行任務調度,硬件中斷也被屏蔽。

void  OSIntEnter (void)

{

if (OSRunning == OS_TRUE) {

if (OSIntNesting < 255u) {

OSIntNesting++;                      /* Increment ISR nesting level                        */

}

}

}

這個函數的作用是對全局變量OSIntNesting增1,OSIntNesting為中斷嵌套深度。

void  OSIntExit (void)

{

#if OS_CRITICAL_METHOD == 3u                               /* Allocate storage for CPU status register */

OS_CPU_SR  cpu_sr = 0u;

#endif

if (OSRunning == OS_TRUE) {

OS_ENTER_CRITICAL();

if (OSIntNesting > 0u) {                           /* Prevent OSIntNesting from wrapping       */

OSIntNesting--;

}

if (OSIntNesting == 0u) {                          /* Reschedule only if all ISRs complete ... */

if (OSLockNesting == 0u) {                     /* ... and not locked.                      */

OS_SchedNew();

OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];

if (OSPrioHighRdy != OSPrioCur) {          /* No Ctx Sw if current task is highest rdy */

#if OS_TASK_PROFILE_EN > 0u

OSTCBHighRdy->OSTCBCtxSwCtr++;         /* Inc. # of context switches to this task  */

#endif

OSCtxSwCtr++;                          /* Keep track of the number of ctx switches */

OSIntCtxSw();                          /* Perform interrupt level ctx switch       */

}

}

}

OS_EXIT_CRITICAL();

}

}

函數的前面部分對OSIntNesting減1,剛好與OSIntEnter() 相對應;后面部分則進行任務調度。

總結:任何中斷服務函數,我們都應該加上 OSIntEnter 和 OSIntExit 函數,UCOSII 是?個可剝奪型的內核,中斷服務?程序運?之后,系統會根據情況進??次任務調度去運?優先級別最?的就緒任務,?并不?定接著運?被中斷的任務!


#if...#endif是C++中的條件編譯預處理命令 有兩種格式:

1:#ifdef 標示符

程序段1

#else

程序段2

#endif

表示:如果標示符已經被#define命令定義過,則編譯程序段1,否則編譯程序段2。期中else部分可以沒有。

2:#if 表達式

程序段1

#else

程序段2

#endif

表示:如果表達式為真,則編譯程序段1,否則編譯程序段2.
if((USART_RX_STA&0x8000)==0) //0x8000,即二進制1000 0000 0000 0000,與變量USART_RX_STA,按位與(&),并與0比較,作用是判斷USART_RX_STA數值第16位是否為0。
USART_RX_STA&0x8000有兩種可能:
第一種1××× ×××× ×××× ××××&1000 0000 0000 0000=1000 0000 0000 0000
第二種0××× ×××× ×××× ××××&1000 0000 0000 0000=0000 0000 0000 0000
由此可以判斷USART_RX_STA第16位是否為0


USART_RX_STA的作用,USART_RX_STA一共有16位,前兩位為標記位,后14位記錄了串口發送的數的位數。第一位標記位標記了Res是否為0x0a,第二位標記位標記了Res是否為0x0d。
知識點:0x0d是回車的ASCLL碼,0x0a是換行的ASCLL碼

USART_RX_BUF這個是用來保存接收到的數據的可以看到每次結束判斷會有
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA=0; //接收狀態標記
USART_RX_STA的作用就是在全部函數之間實現一個消息傳遞,自己設置,自己管理,自己識別。
bit15 bit14 bit13~0
接收完成標志0x0a 接收到0X0d標志 接收到的有效數據個數

USART_RX_STA|=0x4000;將第二位狀態標志位置為1;在倒數第1次循環中使用USART_RX_STA|=0x8000;將第一位狀態標志位也置為1,;而后串口數據接收結束,所有從串口接收的數據保存在USART_RX_BUF[ ]數組中,串口所發送的數據長度保存在USART_RX_STA的后14位中。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • STM32
    +關注

    關注

    2270

    文章

    10914

    瀏覽量

    356724
  • 串口
    +關注

    關注

    14

    文章

    1557

    瀏覽量

    76719
收藏 人收藏

    評論

    相關推薦

    Labview讀取二進制文件(有的時候會自動添加0X0D0x0A前面)

    我是利用Labview開發TCP/IP通信的,需要把接收的網絡數據保存為二進制文件。用UltraEdit查看保存的文件里面有好多二進制值,0x00~0xFF,里面會有
    發表于 05-02 14:48

    stm32串口怎么用DMA接收不定長數據?

    stm32串口怎么用DMA接收不定長數據,求大神點播1. 網上查到,空閑中斷+DMA可以接收
    發表于 08-21 09:21

    串口接收,0x0a0x0d表示的什么?

    void USART1_IRQHandler(void){ u8 res; if(USART1->SR&(163)USART_RX_STA=0;//接收數據錯誤,重新開始接收 }}}
    發表于 08-19 03:09

    stm32識別TC35短信有兩個“0x0d 0x0a”怎么解決?

    原子哥的串口代碼里,遇到0x0d 0x0a就停止接收,但是從TC35模塊讀取短信時,前面的短信息說明,會有兩個“0x0d
    發表于 08-28 08:00

    Labview串口時候數據中的0x0A與換行符沖突怎么解決?

    串口數據傳輸時候,含有0x0A與換行符沖突,如果關閉終止符,那樣就無法識別串口數據結束,無法識別
    發表于 12-06 21:33

    STM32串口接收不定長數據原理是什么

    STM32串口接收不定長數據原理是什么
    發表于 12-08 07:29

    STM32串口接收不定長數據的實現方法

    STM32串口接收不定長數據的實現方法
    發表于 12-09 06:17

    針對接收一幀含有多個字節的不定長數據接收方式進行討論

    (比如0X0D,0X0A)結束 非常常見的一種接收方式,正點原子的例程便是
    發表于 12-09 07:16

    如何利用STM32串口去解析json命令呢

    STM32串口解析json命令(使用HAL庫)串口接收中斷處理(0x0D 0x0A作為結尾)測試
    發表于 01-21 10:07

    STM32串口接收不定長數據的程序免費下載

    本文檔的主要內容詳細介紹的是STM32串口接收不定長數據的程序免費下載。
    發表于 08-26 08:00 ?62次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定長</b><b class='flag-5'>數據</b>的程序免費下載

    STM32串口通信 (采用鏈表接收不定長數據幀)

    STM32串口接收不定長數據幀->鏈表數據幀說明二級目錄三級目錄
    發表于 11-23 18:07 ?30次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b>通信 (<b class='flag-5'>采用</b>鏈表<b class='flag-5'>接收</b><b class='flag-5'>不定長</b><b class='flag-5'>數據</b>幀)

    STM32串口接收不定長數據的幾種方法

    (比如0X0D,0X0A)結束 非常常見的一種接收方式,正點原子的例程便是
    發表于 11-26 13:21 ?17次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定長</b><b class='flag-5'>數據</b>的幾種方法

    stm32 串口接收不定長度數據及黏包處理 + 串口DMA接收

    ,那么stm32串口是如何實現接收不定長度數據的呢? 串口接收
    發表于 12-23 19:09 ?27次下載
    <b class='flag-5'>stm32</b> <b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定長度數據</b>及黏包處理 + <b class='flag-5'>串口</b>DMA<b class='flag-5'>接收</b>

    STM32 DMA串口接收不定長數據

    STM32 DMA串口接收不定長數據
    發表于 12-24 18:50 ?40次下載
    <b class='flag-5'>STM32</b>  DMA<b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定長</b><b class='flag-5'>數據</b>

    RM0451_超低功耗 STM32L0x0 先進的基于 Arm? 的 32 MCU

    RM0451_超低功耗 STM32L0x0 先進的基于 Arm? 的 32 MCU
    發表于 11-23 08:20 ?1次下載
    RM0451_超低功耗 <b class='flag-5'>STM32L0x0</b> 先進的基于 Arm? 的 32 <b class='flag-5'>位</b> MCU
    主站蜘蛛池模板: 男人j进女人j的一进一出视频| 男女免费观看视频| 天天艹在线| 日日干天天草| 狠狠干天天色| 午夜欧美电影| 亚洲成人在线网站| 色你懂的| 美女视频黄.免费网址| 久久成人免费网站| www.色婷婷.com| 天天操人人| 东北美女野外bbwbbw免费| 简单视频在线播放jdav| 色女人综合| 性欧美大战久久久久久久久| 人人草人人爽| 亚洲插插插| 色老头综合| 久久99爰这里有精品国产| www黄色大片| 日韩一级黄色录像| 欧美乱淫| 高清xxx| 日本一卡二卡3卡四卡网站精品| 亚洲图片综合区另类图片| 日本黄色免费在线| 丁香婷婷电影| ts在线视频| 人人干夜夜操| 1515hh四虎免费观com| 黄色网址播放| 最近的中文字幕免费动漫视频| 四虎在线网址| 四虎影视精品| 久久综合九色综合欧洲| 在线干| 天天操天天舔天天射| 五月激情丁香网| 国产h视频在线观看网站免费| 九九热精品视频|