1. 程式人生 > >STM32串列埠中斷接收和中斷髮送

STM32串列埠中斷接收和中斷髮送

STM32串列埠USART1中斷接收和中斷髮送

先貼出中斷函式:

void USART1_IRQHandler(void){
        if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
                 USART_ClearITPendingBit(USART1, USART_IT_RXNE);
                 USART1_Buffer[i++]=USART_ReceiveData(USART1);  //USART1_Buffesh是一個自己定義的接收陣列
                 if(i>3){
                      SendFlag = 1;
                 }
         }
        if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET){    //USART_IT_TC這裡也可替換
                if(Open_Send_Flag){     //這是一個傳送的標誌
                      uart1_sendstring(temp_data);
                     USART_ITConfig(USART1, USART_IT_TXE, DISABLE);   //USART_IT_TC
                     Open_Send_Flag = 0;
                 }
                else{
                     USART_ITConfig(USART1, USART_IT_TXE, DISABLE);   //USART_IT_TC
                 }
         }
}

傳送字串的函式:

void uart1_sendstring(uint8_t* cp)
{
    while((*cp)!='\0')
    {
        Usart1_Send_isr(*cp);
        cp++;
    }
}

傳送單個字元的函式:

void Usart1_Send_isr(uint8_t ch){
     USART_SendData(USART1, (uint8_t)ch);
     while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET ); //這裡做緩衝區是否傳送完判斷
}

然後在中斷函式外面傳送資料的時候,打開發送中斷。USART_ITConfig(USART1, USART_IT_TXE, ENABLE);    //USART_IT_TC

之後再貼出兩個簡單的串列埠接收和傳送的測試小例子:


第一種:中斷接收並把接收到的資料直接傳送。
void USART1_IRQHandler(void){
      unsigned char RxData;
      if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
            USART_ClearITPendingBit(USART1, USART_IT_RXNE);
            RxData=USART_ReceiveData(USART1); 
            RxData = RxData + 1;
           USART_SendData(USART1,RxData);
      }
}

優點:簡單,適合很少量資料傳輸。
缺點:無快取區,並且對資料的正確性沒有判斷,資料量稍大可能導致資料丟失 。 第二種:中斷接收之後判斷資料頭和資料尾,如果正確就直接傳送出去。
void USART1_IRQHandler(void){


 if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
       USART_ClearITPendingBit(USART1, USART_IT_RXNE);
       USART1_Buffer[i++]=USART_ReceiveData(USART1); 
   }
 if((USART1_Buffer[0] == 0x01) && (USART1_Buffer[i-1] == 0x02)){
      Flag = 1;
 }
 if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET){  //溢位,不明白?
  USART_ClearFlag(USART1,USART_FLAG_ORE);
  USART_ReceiveData(USART1); 
 }
 if(Flag){
  for(j = 0;j<20;j++){
        USART_SendData(USART1,USART1_Buffer[j]);
  }
 }
}