超級終端: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語言使用時的相關技巧
最新評論