問題描述
最近在做的一個基于HAL庫的STM32專案需要從多個SPI總線設備讀取資料并通過DMA從串口發送,程式如下:
(RxData為從SPI總線讀取到的資料)
sprintf(tempt, "%c%c%s%c%c%s%c%c%s%c%c%s",
format[0], format[1], (char *)RxData1,
format[2], format[3], (char *)RxData2,
format[4], format[5], (char *)RxData3,
format[6], format[7], (char *)RxData4); // 格式化輸出到字串,每個RxData陣列末尾已添加\0結束符
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)&tempt, 72);
在電腦上位機觀察接收,發現接收到的資料是完全錯誤的,而且在完成一次發送之后MCU程式卡死,
嘗試解決
最扯訓疑是格式化輸出字串長度過長而導致堆疊溢位,在CubeMX配置中將Heap和Stack大小改大,編譯運行仍然會卡死,
由于是采用DMA發送,并且專案對性能要求較高,所以無法分別發送每組資料(因為若分別發送,則必須在每個發送間隙設定延時函式等待DMA發送完成,如果有更好的方法歡迎告訴我:-)),所以只能另想辦法,
問題解決
最后,將程式改為以下形式,成功解決問題:
(使用額外的四個tempt陣列暫存字串,最后將這四個陣列合并到另一個大陣列再進行輸出)
sprintf(tempt1, "%c%c%s", format[0], format[1], (char *)RxData1);
sprintf(tempt2, "%c%c%s", format[2], format[3], (char *)RxData2);
sprintf(tempt3, "%c%c%s", format[4], format[5], (char *)RxData3);
sprintf(tempt4, "%c%c%s", format[6], format[7], (char *)RxData4);
tempt1[18]='\0'; tempt2[18]='\0'; tempt3[18]='\0'; tempt4[18]='\0';
sprintf(tempt, "%s%s%s%s", (char *)tempt1, (char *)tempt2, (char *)tempt3, (char *)tempt4);
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)&tempt, 72);
原因不明,由于占用了雙倍的記憶體,所以肯定不是最優解決方法,如果有高手知道還請賜教,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/256431.html
標籤:其他
上一篇:C語言編程>第二十三周 ① 下列給定程式中,函式fun的功能是:求n!(n<20),所求階乘的值作為函式值回傳。例如,若n=5,則應輸出120。
