www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]//原帖http://bbs.elecfans.com/forum.php?mod=viewthread&tid=445463//在學(xué)習(xí)過程中發(fā)現(xiàn)幾處編譯錯誤,并改正;//主要貼出定義、和中斷函數(shù)部分;uint8_t usart_rx_buf[5][40]; //接收緩沖,最大40個字節(jié)uint8_t us

//原帖http://bbs.elecfans.com/forum.php?mod=viewthread&tid=445463

//在學(xué)習(xí)過程中發(fā)現(xiàn)幾處編譯錯誤,并改正;

//主要貼出定義、和中斷函數(shù)部分;

uint8_t usart_rx_buf[5][40]; //接收緩沖,最大40個字節(jié)
uint8_t usart_rx_temporary[40]; //數(shù)據(jù)保存暫存器,最多能夠緩存40個字節(jié)
uint8_t usartrxbuf_pagebuf=0; //最上面接受緩存的頁碼(5)緩存
uint8_t usart_rd_len=0; //有用信息的數(shù)據(jù)長度
uint8_t usart_rd_lentemp=0; //用來記錄已讀取的數(shù)據(jù)長度
uint8_t usart_rx_enableflag=0; //接收狀態(tài)標(biāo)記
uint8_t usart_rx_lenrightflag=0;//數(shù)據(jù)長度校驗(yàn)位正確標(biāo)志
uint8_t usart_rx_successflag=0; //成功接收到數(shù)據(jù)信息

//中斷函數(shù)

/******************************************************************************************/
//USART2 自定義串口數(shù)據(jù)收發(fā)數(shù)據(jù)校驗(yàn)
//串口每次發(fā)送一個字節(jié)(一個八位二進(jìn)制數(shù)),沒接受一個字節(jié),

//串口中斷一次,就執(zhí)行一次串口中斷函數(shù)。
//串口數(shù)據(jù)校驗(yàn) (包頭0xee)(數(shù)據(jù)長度)(...數(shù)據(jù)...)(數(shù)據(jù)長度反碼)(包尾0xef)
// 每一個括號代表一個字節(jié),而數(shù)據(jù)括號待變N個字?
/******************************************************************************************/
void USART2_IRQHandler(void) //串口2中斷服務(wù)程序
{
uint8_t i,res,check_temp;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中斷,每接收一個字節(jié)(8位二進(jìn)制數(shù)據(jù)),中斷一次,每次中斷(即每接收一個數(shù)據(jù))都執(zhí)行一次下列程序
{
res=USART_ReceiveData(USART2);//讀取接收到的數(shù)據(jù)
if(usart_rx_enableflag==1)//到接受數(shù)據(jù)標(biāo)志置位時,接受數(shù)據(jù)
{
res=USART_ReceiveData(USART2);//讀取串口標(biāo)志
if(usart_rd_lentemp==0)//包頭后第一個數(shù)據(jù)為需要傳輸?shù)臄?shù)據(jù)的長度
{
usart_rd_len=res;//讀取數(shù)據(jù)的長度 !!
if(usart_rd_len>=40)
{
usart_rx_lenrightflag=0;//數(shù)據(jù)長度校驗(yàn)清零
usart_rx_successflag=0;//數(shù)據(jù)接收成功標(biāo)志清零
usart_rx_enableflag=0;//數(shù)據(jù)接收完成,數(shù)據(jù)接收啟動標(biāo)志清零
usart_rd_len=0; //數(shù)據(jù)長度清零
usart_rd_lentemp=0;//數(shù)據(jù)長度暫存器清零
}
}

else if(usart_rd_lentemp==usart_rd_len+1)//當(dāng)讀取到第usart_rd_lentemp+1個數(shù)據(jù)時,校驗(yàn)是否是長度信息的反碼
{
check_temp=~usart_rd_len;//取數(shù)據(jù)長度校驗(yàn)位的反碼
if(res==check_temp)//當(dāng)數(shù)據(jù)長度校驗(yàn)正確時
usart_rx_lenrightflag=1;//數(shù)據(jù)長度校驗(yàn)標(biāo)志置一
else
{ //當(dāng)數(shù)據(jù)長度校驗(yàn)錯誤時
usart_rx_lenrightflag=0;//數(shù)據(jù)長度校驗(yàn)清零
usart_rx_successflag=0;//數(shù)據(jù)接收成功標(biāo)志清零
usart_rx_enableflag=0;//當(dāng)數(shù)據(jù)長度校驗(yàn)錯誤時,數(shù)據(jù)接收啟動標(biāo)志清零
usart_rd_len=0;//數(shù)據(jù)長度清零
usart_rd_lentemp=0; //數(shù)據(jù)長度暫存器清零
}
}
else if(usart_rd_lentemp==usart_rd_len+2)//當(dāng)讀取到第usart_rd_lentemp+2個數(shù)據(jù)時,校驗(yàn)包尾是否正確
{
if((res==0xef)&&(usart_rx_lenrightflag==1))//如果包尾數(shù)據(jù)與長度校驗(yàn)都正確
{
usart_rx_lenrightflag=0;//數(shù)據(jù)長度校驗(yàn)清零
usart_rx_successflag=1; //數(shù)據(jù)接收成功標(biāo)志置一
usart_rx_enableflag=0;//數(shù)據(jù)接收完成,數(shù)據(jù)接收啟動標(biāo)志清零
//usart_rd_len=0; //數(shù)據(jù)長度清零
usart_rd_lentemp=0;//數(shù)據(jù)長度暫存器清零
}
else
{ //當(dāng)包尾數(shù)據(jù)校驗(yàn)錯誤時
usart_rx_lenrightflag=0;//數(shù)據(jù)長度校驗(yàn)清零
usart_rx_successflag=0;//數(shù)據(jù)接收成功標(biāo)志清零
usart_rx_enableflag=0;//數(shù)據(jù)接收完成,數(shù)據(jù)接收啟動標(biāo)志清零
usart_rd_len=0;//數(shù)據(jù)長度清零
usart_rd_lentemp=0;//數(shù)據(jù)長度暫存器清零
}
}
else usart_rx_temporary[usart_rd_lentemp-1]=res; //當(dāng)usart_rd_lentemp為數(shù)據(jù)段時,將數(shù)據(jù)存到串口數(shù)據(jù)接收寄存器中

usart_rd_lentemp++;//每次記錄數(shù)據(jù),數(shù)據(jù)長度暫存器自加
if(usart_rx_successflag==1)//如果成功接收到信息數(shù)據(jù),將緩存usart_rx_temporary[]內(nèi)的數(shù)據(jù)傳遞給usart_rx_buf[][]
{
for(i=0;iusart_rx_buf[usartrxbuf_pagebuf][i]=usart_rx_temporary[i];
usartrxbuf_pagebuf++;//接受緩存的頁碼緩存自加
if(usartrxbuf_pagebuf==5) usartrxbuf_pagebuf=0;//接受緩存的頁碼緩存最大數(shù)為5


usart_rx_lenrightflag=0;//數(shù)據(jù)長度校驗(yàn)清零
usart_rx_successflag=0;//數(shù)據(jù)接收成功標(biāo)志清零
usart_rx_enableflag=0;//數(shù)據(jù)接收完成,數(shù)據(jù)接收啟動標(biāo)志清零
usart_rd_len=0; //數(shù)據(jù)長度清零
usart_rd_lentemp=0;//數(shù)據(jù)長度暫存器清零
// USART2_SendData("successed rx!rn");
}
}
if((res==0xee)&&(usart_rx_enableflag==0))//當(dāng)接受到包頭(0xee)數(shù)據(jù)并且還沒有成功接收完數(shù)據(jù)信息
usart_rx_enableflag=1;//說明這是包頭,啟動接收數(shù)據(jù)標(biāo)志,進(jìn)入數(shù)據(jù)接收階段
}
USART_ClearITPendingBit(USART2, USART_IT_RXNE);//中斷清除
}


//標(biāo)紅的地方,是和原文中不同的地方。

//首先usart_rd_len=0;這句如果存在,則在成功標(biāo)志為1條件中無法給rx_buf賦值,因?yàn)閕<0一直循環(huán)直接跳出;

//后面那兩句如果在頭則會直接進(jìn)入下一個if,使數(shù)據(jù)長度也為0xEE,就錯啦。


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

在嵌入式開發(fā)中,STM32的時鐘系統(tǒng)因其靈活性和復(fù)雜性成為開發(fā)者關(guān)注的焦點(diǎn)。然而,看似簡單的時鐘配置背后,隱藏著諸多易被忽視的陷阱,輕則導(dǎo)致系統(tǒng)不穩(wěn)定,重則引發(fā)硬件損壞。本文從時鐘源選擇、PLL配置、總線時鐘分配等關(guān)鍵環(huán)...

關(guān)鍵字: STM32 時鐘系統(tǒng)

在嵌入式系統(tǒng)開發(fā)中,STM32系列微控制器的內(nèi)部溫度傳感器因其低成本、高集成度特性,廣泛應(yīng)用于設(shè)備自檢、環(huán)境監(jiān)測等場景。然而,受芯片工藝差異和電源噪聲影響,其原始數(shù)據(jù)存在±1.5℃的固有誤差。本文從硬件配置、校準(zhǔn)算法、軟...

關(guān)鍵字: STM32 溫度傳感器

在能源效率與智能化需求雙重驅(qū)動下,AC-DC轉(zhuǎn)換器的數(shù)字控制技術(shù)正經(jīng)歷從傳統(tǒng)模擬方案向全數(shù)字架構(gòu)的深刻變革?;赟TM32微控制器的PFM(脈沖頻率調(diào)制)+PWM(脈沖寬度調(diào)制)混合調(diào)制策略,結(jié)合動態(tài)電壓調(diào)整(Dynam...

關(guān)鍵字: AC-DC STM32

在當(dāng)今數(shù)字化與智能化飛速發(fā)展的時代,數(shù)據(jù)量呈爆發(fā)式增長,對數(shù)據(jù)處理的實(shí)時性、高效性以及安全性提出了前所未有的挑戰(zhàn)。AI 邊緣計算網(wǎng)關(guān),作為融合了人工智能(AI)與邊緣計算技術(shù)的創(chuàng)新產(chǎn)物,正逐漸嶄露頭角,成為推動各行業(yè)邁向...

關(guān)鍵字: 數(shù)據(jù)處理 邊緣計算 人工智能

當(dāng)前智能家居產(chǎn)品需求不斷增長 ,在這一背景下 ,對現(xiàn)有澆花裝置缺陷進(jìn)行了改進(jìn) ,設(shè)計出基于STM32單片機(jī)的全 自動家用澆花機(jī)器人。該設(shè)計主要由機(jī)械結(jié)構(gòu)和控制系統(tǒng)構(gòu)成 ,機(jī)械結(jié)構(gòu)通過麥克納姆輪底盤與噴灑裝置的結(jié)合實(shí)現(xiàn)機(jī)器...

關(guān)鍵字: STM32 麥克納姆輪 安全可靠 通過性強(qiáng)

用c++編程似乎是讓你的Arduino項(xiàng)目起步的障礙嗎?您想要一種更直觀的微控制器編程方式嗎?那你需要了解一下Visuino!這個圖形化編程平臺將復(fù)雜電子項(xiàng)目的創(chuàng)建變成了拖動和連接塊的簡單任務(wù)。在本文中,我們將帶您完成使...

關(guān)鍵字: Visuino Arduino ESP32 STM32

基于STM32與LoRa技術(shù)的無線傳感網(wǎng)絡(luò)憑借其低功耗、廣覆蓋、抗干擾等特性,成為環(huán)境監(jiān)測、工業(yè)自動化等場景的核心解決方案。然而,如何在復(fù)雜電磁環(huán)境中實(shí)現(xiàn)高效休眠調(diào)度與動態(tài)信道優(yōu)化,成為提升網(wǎng)絡(luò)能效與可靠性的關(guān)鍵挑戰(zhàn)。本...

關(guān)鍵字: STM32 LoRa

在實(shí)時控制系統(tǒng)、高速通信協(xié)議處理及高精度數(shù)據(jù)采集等對時間敏感的應(yīng)用場景中,中斷響應(yīng)延遲的優(yōu)化直接決定了系統(tǒng)的可靠性與性能上限。STM32系列微控制器憑借其靈活的嵌套向量中斷控制器(NVIC)、多通道直接內(nèi)存訪問(DMA)...

關(guān)鍵字: STM32 DMA

數(shù)字電源技術(shù)向高功率密度、高效率與高動態(tài)響應(yīng)方向加速演進(jìn),STM32微控制器憑借其基于DSP庫的算法加速能力與對LLC諧振變換器的精準(zhǔn)控制架構(gòu),成為優(yōu)化電源動態(tài)性能的核心平臺。相較于傳統(tǒng)模擬控制或通用型數(shù)字控制器,STM...

關(guān)鍵字: STM32 數(shù)字電源

STM32微控制器憑借其針對電機(jī)控制場景的深度優(yōu)化,成為高精度、高可靠性驅(qū)動系統(tǒng)的核心選擇。相較于通用型MCU,STM32在電機(jī)控制領(lǐng)域的核心優(yōu)勢集中體現(xiàn)在FOC(磁場定向控制)算法的硬件加速引擎與PWM死區(qū)時間的動態(tài)補(bǔ)...

關(guān)鍵字: STM32 電機(jī)控制
關(guān)閉