当前位置:网站首页>Troubleshooting the cause of the crash when STM32 serial port dam receives 253 bytes
Troubleshooting the cause of the crash when STM32 serial port dam receives 253 bytes
2022-07-02 23:09:00 【ydgd118】
I made a plan a few days ago , It's about STM32 adopt M5311 Connect MQTT How to communicate with the server . After all parameters are tested , adopt MQTT The server sent a 300bytes Device parameter configuration instructions , As a result, it crashed directly . After many tests , The problem phenomenon is specifically determined as MQTT Server send 253 Bytes can be normal , Send greater than 254 Byte above STM32 Must crash .
To locate the cause of the problem , So separate tests . Test first STM32 Serial port communication , A serial port DMA To receive the 500 Bytes are also normal . Then test it separately M5311, Serial port sent 300 Bytes are also normal . It's depressing , It's OK for both of them to be alone , Why did they crash together .
- First, it is suspected that the serial port receiving cache is not enough , So I checked , yes 1000 byte , More than enough !
- It is doubted that it is serial port ORE Overflow causes crash , As a result, the program tracked for a long time , That's all right. , It is wronged .
- Check the serial port waveform , Find out STM32 It seems that the baud rate is a little lower , But they can recognize each other , It should be within the error range . Adjust the baud rate a little , The problem is still loud .
- Doubt again DMA error , Program tracking inspection , That's right .
- There is no way out , Then trace the serial port interrupt function . In all if–else Print statements are added in , All the way down , It is found that the serial port interrupt processing is also very perfect . It is also wronged .
- After the serial port interrupt processing is completed , Is the server instruction parsing function , Finally check it . Actually, the problem is caused by it ! After receiving serial port data , It first moves the data to another cache array , Then open the DMA Receive the next batch of data . The problem lies in moving , Used for loop , And the loop variable used is uint8_t, But the judgment condition for exiting the cycle is beyond 255 Of , That is, it inadvertently becomes a dead cycle . So it crashed .
/******************************************************************** Letter Count name :void Data_Transfer_To_Cache(void) function : Data is cached to another array , Then open it again immediately DMA Receive Parameters : nothing Return value : nothing ***********************************************************************/
uint8_t Data_Transfer_To_Cache(void)
{
// First, transfer it immediately , Then open the DMA receive , Then judge
uint8_t data_err = 0;
Clear_Tmp_Sz();
if(UART3_Rx_len<TP_LENGTH)// Prevent the array from accidentally crossing the bounds
{
for(uint16_t i=0;i<UART3_Rx_len;i++)
{
tmp_rx_sz[i] = UART3_Rx_buffer[i];
}
tmp_i = UART3_Rx_len;
}
else
{
data_err = 1;
}
DMA_UART3_Start();// Clear receive cache , open DMA Continue to receive
// printf("\r\n%s\r\n",tmp_rx_sz);
if(data_err)
{
printf(" Data out of cache !\r\n");
return 0;
}
else
{
return 1;
}
}
This function is responsible for moving bricks , Among them for(uint8_t i=0; i<UART3_Rx_len; i++) loop , stay UART3_Rx_len Greater than 255 When , It's a cycle . This is directly from the previous project copy Over here , I didn't consider this at all i There will be problems .
It took 2 Days time , I checked everything from hardware to software , Even the serial port waveform has been checked , A small problem wastes a lot of time , It's a lesson . I hope you can take a warning , Later transplantation copy Code carefully , Or simply write code for this loop ,i Variables are always used uint32_t type , It's impossible to get out .
边栏推荐
- The kth largest element in the [leetcode] array [215]
- mysql重置密码,忘记密码,重置root密码,重置mysql密码
- Prometheus deployment
- Motivation du Protocole de chiffrement avancé AES
- Sword finger offer II 099 Sum of minimum paths - double hundred code
- BBR 遭遇 CUBIC
- [leetcode] there are duplicate elements [217]
- Splunk audit setting
- Odoo13 build a hospital HRP environment (detailed steps)
- Construction of Hisilicon 3559 universal platform: draw a frame on the captured YUV image
猜你喜欢

BBR 遭遇 CUBIC

Chow-Liu Tree
![[chestnut sugar GIS] ArcScene - how to make elevation map with height](/img/91/f3df0a7633263c6264cb5c27eb149f.png)
[chestnut sugar GIS] ArcScene - how to make elevation map with height

Webrtc audio and video capture and playback examples and mediastream media stream analysis

情感对话识别与生成简述

Chow-Liu Tree

LeetCode 968. 监控二叉树

Xshell configuration xforward forwarding Firefox browser

聊聊内存模型与内存序

实现BottomNavigationView和Navigation联动
随机推荐
Static file display problem
海思3559万能平台搭建:在截获的YUV图像上画框
Application of containerization technology in embedded field
QT qpprogressbar details
The motivation of AES Advanced Encryption Protocol
门牌制作 C语言
密码技术---密钥和SSL/TLS
Kubernetes uses the host name to allocate the pod on the specified node
程序员版本的八荣八耻~
Solving ordinary differential equations with MATLAB
Odoo13 build a hospital HRP environment (detailed steps)
[leetcode] number of palindromes [9]
聊聊内存模型与内存序
How does Jerry test the wrong touch rate of keys [chapter]
Generics and reflection, this is enough
Lc173. Binary search tree iterator
Chow-Liu Tree
设置单击右键可以选择用VS Code打开文件
剑指 Offer II 099. 最小路径之和-双百代码
P1007 single log bridge