首頁>技術>

超級終端:HyperTerminal

微控制器輸入1y然後按回車鍵

採用串列埠1對超級終端內輸入到的資料進行接受併發送。

串列埠1的中斷程式如下:

void USART1_IRQHandler(void){ //串列埠1中斷服務程式(固定的函式名不能修改)		u8 Res;	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){  //接收中斷(接收到的資料必須是0x0d 0x0a結尾)				Res =USART_ReceiveData(USART1);//(USART1->DR);	//讀取接收到的資料		printf("%c",Res); //把收到的資料以 a符號變數 傳送回電腦				if((USART1_RX_STA&0x8000)==0){//接收未完成	因為每次超級終端					if(USART1_RX_STA&0x4000){//接收到了0x0d								if(Res!=0x0a)USART1_RX_STA=0;//接收錯誤,重新開始	   為什麼是0x0A,在超級終端裡面按下回車鍵實際上就是按下0x0D回車鍵和0x0A換行鍵兩個鍵				else USART1_RX_STA|=0x8000;	//接收完成了 			}else{ //還沒收到0X0D									if(Res==0x0d)USART1_RX_STA|=0x4000;			//0x0d實際上就是回車按鍵				else{					USART1_RX_BUF[USART1_RX_STA&0X3FFF]=Res ; //將收到的資料放入陣列					USART1_RX_STA++;	//資料長度計數加1					if(USART1_RX_STA>(USART1_REC_LEN-1))USART1_RX_STA=0;//接收資料錯誤,重新開始接收	  				}		 			}		}   		 	} }

USART1_RX_STA其定義如下

//bit15, 接收完成標誌 15bit用來判斷是否接受ascii到0x0A換行鍵

//bit14, 接收到0x0d ox0d是回車的ascii

//bit13~0, 接收到的有效位元組數目

//u16 USART1_RX_STA=0; //接收狀態標記

主函式如下:

USART1_RX_STA=0xC000; //初始值設為有回車的狀態,即顯示一次歡迎詞	while(1){		if(USART1_RX_STA&0xC000){ //如果標誌位是0xC000表示收到資料串完成,可以處理。			if((USART1_RX_STA&0x3FFF)==0){ //單獨的回車鍵再顯示一次歡迎詞				printf("\033[1;47;33m\r\n"); //設定顏色(參考超級終端使用)				printf(" 1y--開LED1燈      1n--關LED1燈 \r\n");				printf(" 2y--開LED2燈      2n--關LED2燈 \r\n");				printf(" 請輸入控制指令,按回車鍵執行! \033[0m\r\n");			}else if((USART1_RX_STA&0x3FFF)==2 && USART1_RX_BUF[0]=='1' && USART1_RX_BUF[1]=='y'){ //判斷資料是不是2個,第一個資料是不是“1”,第二個是不是“y”				GPIO_SetBits(LEDPORT,LED1); //LED燈都為高電平(1)				printf("1y -- LED1燈已經點亮!\r\n");			}else if((USART1_RX_STA&0x3FFF)==2 && USART1_RX_BUF[0]=='1' && USART1_RX_BUF[1]=='n'){				GPIO_ResetBits(LEDPORT,LED1); ////LED燈都為低電平(0)				printf("1n -- LED1燈已經熄滅!\r\n");			}else if((USART1_RX_STA&0x3FFF)==2 && USART1_RX_BUF[0]=='2' && USART1_RX_BUF[1]=='y'){				GPIO_SetBits(LEDPORT,LED2); //LED燈都為高電平(1)				printf("2y -- LED2燈已經點亮!\r\n");			}else if((USART1_RX_STA&0x3FFF)==2 && USART1_RX_BUF[0]=='2' && USART1_RX_BUF[1]=='n'){				GPIO_ResetBits(LEDPORT,LED2); ////LED燈都為低電平(0)				printf("2n -- LED2燈已經熄滅!\r\n");			}else{ //如果以上都不是,即是錯誤的指令。				printf("指令錯誤!\r\n"); 			}			USART1_RX_STA=0; //將串列埠資料標誌位清0		}	}}

相關理解:

1:從實際操作以及程式對比,超級終端內只要輸入字元,那麼就已經發送給了微控制器,並非是輸入一系列字元後按回車鍵才最終一次性發送

2:超級終端內按下鍵盤的回車鍵實際上是向單片機發送兩個字元,一個是0x0d回車鍵,一個是0x0A換行鍵,其對應的是ascii這兩個字元

3:注意裡面的C語言使用時的相關技巧

12
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • pyautogui的初步使用