Unable to receive UART data randomly
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2019-03-29 03:29 AM
Hi,
I'm using STM32L0 series and working on UART to communicate with other module and I had chosen the polling method because i know the device max response time and exact data what i'm going to receive. I was running my application for testing and it worked fine for 24 hours and then after and MCU not able to receive data even the module is responding i don't understand this scenario, can anyone please suggest what could be the problem. Thanks in advance.
Regards,
Vijay Rakesh
HAL_UART_Transmit(&huart1,A_Buff,7,200);
HAL_UART_Receive(&huart1,Rx_Buf,4,5000); // Timeout value is 5 seconds to receive data
Solved! Go to Solution.
- Labels:
-
STM32L0 Series
-
UART-USART
Accepted Solutions
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2019-04-01 08:10 AM
In my work I generally use a pair of FIFO buffers, and manage the reception/transmission from those directly in the IRQ Handler. The data is inserted and removed from the FIFO in a worker or foreground task so the interrupt is not loaded with processing overhead.
Up vote any posts that you find helpful, it shows what's working..
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2019-03-29 05:23 AM
It is looking for trouble to process rx in polling. At least get a cyclic dma buffer in reception si there won t be any timeout issue.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2019-03-29 05:40 AM
Hi @S.Ma​
Thanks for the reply, I don't have any idea on implementing DMA could please refer any document so that i can implement your suggestion and just now I have implemented UART interrupt method could this method can solve the above issue?
Regards,
Vijay Rakesh.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2019-03-29 05:54 AM
Check on stm32 library folders, nucleo board, usart projects.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2019-03-29 08:01 AM
They way you've implemented this with blocking functions is not conducive to concurrent transmit/receive. The HAL libraries just make such a mess of this rather than implementing some clean ring buffering.
My guess would be that you are getting over/under run type errors, or noise errors that don't get cleared and result in data loss. Compounded by fixed expectations about how much data will be received.
Up vote any posts that you find helpful, it shows what's working..
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2019-03-31 10:17 PM
Hi @Community member​ ,
Thanks for the reply, what can be the best solution for implementing concurrent transmit/receive.
Regards,
Vijay Rakesh
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2019-04-01 08:10 AM
In my work I generally use a pair of FIFO buffers, and manage the reception/transmission from those directly in the IRQ Handler. The data is inserted and removed from the FIFO in a worker or foreground task so the interrupt is not loaded with processing overhead.
Up vote any posts that you find helpful, it shows what's working..
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2019-04-01 10:57 PM
I was actually trying to do the same after facing the issue but i couldn't find the call back for each UART data I receive and I can only find HAL_UART_RxCpltCallback() where I need to mention how much data I'm about to receive.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2019-04-01 11:53 PM
HAL functions are built for expected length messages. Otherwise, use length of "1".
Otherwise use LL (low layer) especially for USART peripheral as it's pretty manageable.