اطلاعیه

Collapse
No announcement yet.

عدم دریافت مناسب uart در مد idle

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    عدم دریافت مناسب uart در مد idle

    سلام . من با استفاده از uart در مد DMAو با استفاده از وقفه idle دیتای gps رو هر یک ثانیه دریافت میکنم و روی یک پرت دیگه ارسالش میکنم .
    این کار رو با توابع hal انجامشون دادم.
    نمونه دیتای دریافتی
    کد:
    $GPRMC,073915.00,A,2859.21236,N,05050.16033,E,0.132,,200520,,,A*79
    $GPVTG,,T,,M,0.132,N,0.244,K,A*21
    $GPGGA,073915.00,2859.21236,N,05050.16033,E,1,07,1.23,0.4,M,-19.2,M,,*74
    $GPGSA,A,3,13,17,02,24,28,19,12,,,,,,2.83,1.23,2.55*08
    $GPGSV,3,1,11,02,48,165,19,06,56,110,,12,26,304,36,13,17,196,28*7F
    $GPGSV,3,2,11,15,18,227,,17,29,039,34,19,50,029,25,24,55,305,28*79
    $GPGSV,3,3,11,25,01,291,,28,18,082,21,30,00,142,*4B
    [FONT=Yekan]$GPGLL,2859.21236,N,05050.16033,E,073915.00,A,A*65[/FONT]
    اما ایرادی که داره از هر چندتا دیتایی که داریم یکیشون چندتا بایت اولشو(معمولا چهار پنج تا بیشتر نمیشه ) نمیگیره .
    بافرش رو هم مانیتور کردم اصلا توی بافر دریافت ندارتشون
    این هم کد idle

    کد:
    [FONT=Yekan]void USER_UART_IRQHandler(UART_HandleTypeDef *huart)[/FONT]{
        if(USART1 == huart1.Instance)                                   //Determine whether it is serial port 1
        {
            if(RESET != __HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE))   //Judging whether it is idle interruption
            {
                __HAL_UART_CLEAR_IDLEFLAG(&huart1);                     //Clear idle interrupt sign (otherwise it will continue to enter interrupt)
               // printf("\r\nUART1 Idle IQR Detected\r\n");
                USAR_UART_IDLECallback(huart);                          //Call interrupt handler
            }
        }
    }
    
    
    
    
    
    
    
    
    
    
    void USAR_UART_IDLECallback(UART_HandleTypeDef *huart)
    {
        //Stop this DMA transmission
        HAL_UART_DMAStop(&huart1);  
         //HAL_UART_Abort(&huart1);                                                  
        //Calculate the length of the received data
        uint8_t data_length  = BUFFER_SIZE - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);   
        
        //Test function: Print out the received data
       // printf("Receive Data(length = %d): ",data_length);
        if(receive_buff[0]=='$')
        {
          HAL_UART_Transmit(&huart2,receive_buff,strlen(receive_buff),0x4000);
          HAL_UART_Transmit(&huart3,receive_buff,strlen(receive_buff),0x4000);
          //HAL_UART_Transmit(&huart2,receive_buff,data_length,0x4000); 
        }
        //printf("\r\n");
        
        //Zero Receiving Buffer
        //memset(receive_buff,0,data_length);  
        memset(receive_buff,0,strlen(receive_buff));  
        data_length = 0;
        
        //Restart to start DMA transmission of 255 bytes of data at a time
    [FONT=Yekan]    HAL_UART_Receive_DMA(&huart1, (uint8_t*)receive_buff, 980); 
    [/FONT]
    خودم حس میکنم توابع حال سنگینه و باعث میشه میکرو دیر برسه به جاییی که باید استارت کنه برای دریافت دیتا
    بنظرتون مشکل از کجاست؟

    #2
    پاسخ : عدم دریافت مناسب uart در مد idle

    سلام مجدد
    من متوجه شدم که به اشتباه در مد معمولی ارسالم رو انجام میدادم
    پس سعی کردم توی مد dma ارسالش کنم اما کلا هیچ چیزی توی این مد ارسال نمیکنه

    دیدگاه


      #3
      پاسخ : عدم دریافت مناسب uart در مد idle

      سلام.
      دوستان اشتباه نهاییم رو هم متوجه شدم . اونجایی که دستور ارسال رو میزدم من بلافاصله دستور خالی کردن بافر و دریافت جدید رو میزدم و فکر میکردم توی کتابخونه خودش توی یه بافر دیگه ذخیره میکنه و میفرستدش
      چکش که کردم متوجه شدم مستقیما همون بافر رو داره ارسال میکنه . بخاطر همین من ابتدا بافر دریافت رو توی یه بافر دیگه کپی کردم و بافر کپی شده رو ارسال کردم. مشکل حل شد .

      دیدگاه

      لطفا صبر کنید...
      X