当前位置:网站首页>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 .
边栏推荐
猜你喜欢

Jinglianwen technology's low price strategy helps AI enterprises reduce model training costs

Odoo13 build a hospital HRP environment (detailed steps)
![[npuctf2020]ezlogin XPath injection](/img/6e/dac4dfa0970829775084bada740542.png)
[npuctf2020]ezlogin XPath injection

Qt QSplitter拆分器

Strictly abide by the construction period and ensure the quality, this AI data annotation company has done it!

PotPlayer设置最小化的快捷键

Loss function~

Set right click to select vs code to open the file

Cryptography -- the mode of block cipher

C#中Linq用法汇集
随机推荐
The kth largest element in the [leetcode] array [215]
Typical case of data annotation: how does jinglianwen technology help enterprises build data solutions
Static file display problem
psnr,ssim,rmse三个指标的定量分析
海思3559万能平台搭建:在截获的YUV图像上旋转操作
Configuration clic droit pour choisir d'ouvrir le fichier avec vs Code
Analyse des données dossiers d'apprentissage - - analyse simple de la variance à facteur unique avec Excel
中国信通院、清华大学、腾讯安全,云原生安全产学研用强强联合!
Kubernetes uses the host name to allocate the pod on the specified node
SQL进阶语法
Learning Websites commonly used by circuit designers
PMP project integration management
Value sequence < detailed explanation of daily question >
Qt QScrollArea
为什么RTOS系统要使用MPU?
Jerry's prototype has no touch, and the reinstallation becomes normal after dismantling [chapter]
创新实力再获认可!腾讯安全MSS获2022年度云原生安全守护先锋
Easyclick, EC Quanlang network verification source code
[hardware] origin of standard resistance value
[leetcode] most elements [169]