当前位置:网站首页>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 .
边栏推荐
- Redis 过期策略+conf 记录
- 設置單擊右鍵可以選擇用VS Code打開文件
- Jericho's thimble reaction when directly touching the prototype is abnormal [chapter]
- Chow-Liu Tree
- [leetcode] reverse string [344]
- Jerry's charge unplugged, unable to touch the boot [chapter]
- 实现BottomNavigationView和Navigation联动
- Loss function~
- STM32串口DAM接收253字节就死机原因排查
- 设置单击右键可以选择用VS Code打开文件
猜你喜欢

Brief introduction of emotional dialogue recognition and generation

China Academy of information technology, Tsinghua University, Tencent security, cloud native security, industry university research and use strong alliance!

Learning records of data analysis (II) -- simple use of response surface method and design expert

创新实力再获认可!腾讯安全MSS获2022年度云原生安全守护先锋

STM32之ADC

xshell配置xforward转发火狐浏览器

odoo13搭建医院HRP环境(详细步骤)

容器化技术在嵌入式领域的应用

The motivation of AES Advanced Encryption Protocol

【喜欢的诗词】好了歌
随机推荐
聊聊内存模型与内存序
Jerry's fast touch does not respond [chapter]
2016. 增量元素之间的最大差值
Methods to solve the tampering of Chrome browser and edeg browser homepage
To myself who is about to work
Array advanced improvement
WebRTC音视频采集和播放示例及MediaStream媒体流解析
海思 VI接入视频流程
STM32之ADC
Qt QScrollArea
Antd component upload uploads xlsx files and reads the contents of the files
Configuration clic droit pour choisir d'ouvrir le fichier avec vs Code
Boot actuator - Prometheus use
Prometheus deployment
严守工期,确保质量,这家AI数据标注公司做到了!
地平线2022年4月最新方案介绍
[favorite poems] OK, song
MySQL queries nearby data And sort by distance
Numerical solution of partial differential equations with MATLAB
静态文件显示问题