STM32單片機(jī)串口接收不定長無標(biāo)志位字符串定時(shí)器判斷結(jié)束
掃描二維碼
隨時(shí)隨地手機(jī)看文章
寫在前面的話,以警示所有程序員。
你們或許還沒有發(fā)現(xiàn),隨著我們深入編程領(lǐng)域的時(shí)間越久,我們程序員的思維越來越簡單,情商也越來越低,這就是編程行業(yè)對(duì)我們自身的影響。整體跟邏輯的東西打交道,思維當(dāng)然會(huì)固化。如何避免呢?想知道的話留個(gè)言,我會(huì)在下一篇博文中更新。
還要警示的是:做一個(gè)程序員的能力是有限的,一個(gè)程序員團(tuán)隊(duì)才可以做成大事。無論哪種語言,哪種程序,都不重要,重要的是我們的思路和邏輯,語言只是工具,不是目的!
//串口1中斷服務(wù)程序
void USART1_IRQHandler(void)
{
u8 rec_data;
u8 i=0;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷
{
rec_data =(u8)USART_ReceiveData(USART1); //(USART1->DR) 讀取接收到的數(shù)據(jù)
if((USART_RX_STA & 0x80)==0) //接收未完成,未檢測到 0x0d 0x0a的結(jié)束符
{
USART_RX_BUF[USART_RX_STA & 0X7F]=rec_data;
USART_RX_STA++;
if(USART_RX_STA>127){USART_RX_STA=0;}//接收超過127,直接復(fù)位,重新接收
else {U1_Rx_Tout=0;Tout_Start=1;} //置零,開始計(jì)時(shí)
}
}
}
//定時(shí)器2中斷服務(wù)函數(shù)
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET) //溢出中斷
{
if(Tout_Start==1){
U1_Rx_Tout++;//接收超時(shí)累加
if(U1_Rx_Tout>=2){USART_RX_STA|=0x80;Tout_Start=0;}}//超過20ms,接收結(jié)束
}
TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中斷標(biāo)志位
}
//主循環(huán):接收到數(shù)據(jù),判斷結(jié)束后,及時(shí)發(fā)送到電腦
while(1)
{
if(USART_RX_STA&0x80)
{
len=USART_RX_STA&0x7F;//讀取接收數(shù)據(jù)的長度
uart1SendChars(USART_RX_BUF,len);//發(fā)送
USART_RX_STA=0; //一定要清零,否則重復(fù)執(zhí)行if以及無法接收新數(shù)據(jù)
}
}