سلام . من با استفاده از uart در مد DMAو با استفاده از وقفه idle دیتای gps رو هر یک ثانیه دریافت میکنم و روی یک پرت دیگه ارسالش میکنم .
این کار رو با توابع hal انجامشون دادم.
نمونه دیتای دریافتی
اما ایرادی که داره از هر چندتا دیتایی که داریم یکیشون چندتا بایت اولشو(معمولا چهار پنج تا بیشتر نمیشه ) نمیگیره .
بافرش رو هم مانیتور کردم اصلا توی بافر دریافت ندارتشون
این هم کد idle
خودم حس میکنم توابع حال سنگینه و باعث میشه میکرو دیر برسه به جاییی که باید استارت کنه برای دریافت دیتا
بنظرتون مشکل از کجاست؟
این کار رو با توابع 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]
بنظرتون مشکل از کجاست؟
دیدگاه