找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2974|回復(fù): 8
收起左側(cè)

STM32F407單片機(jī)串口丟數(shù)據(jù)問題

[復(fù)制鏈接]
ID:404263 發(fā)表于 2022-5-4 16:47 | 顯示全部樓層 |閱讀模式
不知道有沒有人遇到過,最近學(xué)習(xí)系統(tǒng)之類的自己熟悉的單片機(jī)RAM不夠,用STM的但是之前都是用標(biāo)準(zhǔn)庫的,HAL庫非常不習(xí)慣,這個(gè)調(diào)了一天也不知道是哪里出現(xiàn)問題了,發(fā)送過快的壞還會出現(xiàn)卡死的情況,這個(gè)程序就是接受一個(gè)字符然后馬上發(fā)送回去一個(gè)同樣的字符實(shí)在沒想到為什么會漏數(shù)據(jù),找了很多資料都是說數(shù)據(jù)沒及時(shí)處理,但是我在回調(diào)函數(shù)里面處理了應(yīng)該沒有更快的方法了吧。
B~PDZY$V$){LR2])CHDF.png
download.png
回復(fù)

使用道具 舉報(bào)

ID:301191 發(fā)表于 2022-5-5 03:12 | 顯示全部樓層
頂一下
回復(fù)

使用道具 舉報(bào)

ID:405850 發(fā)表于 2022-5-5 08:08 | 顯示全部樓層
使用CubeMX配置  用DMA試試
回復(fù)

使用道具 舉報(bào)

ID:404263 發(fā)表于 2022-5-5 08:31 | 顯示全部樓層
 發(fā)表于 2022-5-5 08:08
使用CubeMX配置  用DMA試試

我這個(gè)就是用CubeMx的DMA沒怎么用過,主要是也沒理由說串口中斷就不行啊
回復(fù)

使用道具 舉報(bào)

ID:752974 發(fā)表于 2022-5-5 08:33 | 顯示全部樓層
HAL的接收函數(shù)太繁瑣,可以自己寫一個(gè)接收函數(shù),中斷調(diào)用,回調(diào)函數(shù)是在中斷中調(diào)用的,中斷中不易處理數(shù)據(jù),中斷函數(shù)月精簡越好。
回復(fù)

使用道具 舉報(bào)

ID:404263 發(fā)表于 2022-5-5 08:55 | 顯示全部樓層
好像找打原因了,HAL_UART_Transmit(&huart5,&RxData,1,2);HAL_UART_Receive_IT(&huart5,&RxData,1);這兩個(gè)不能都&RxData,因?yàn)榘l(fā)送那邊沒有把發(fā)送的值先讀出來,而是*p直接賦值到DR寄存器,如果這時(shí)候還沒賦給DR前就觸發(fā)了下一個(gè)讀取中斷的話就會導(dǎo)致調(diào)過了一個(gè)數(shù)據(jù),但是新的問題又出現(xiàn)了,改好后確實(shí)不漏了,但是如果發(fā)送的間隔比較短會出現(xiàn)串口卡死的情況
回復(fù)

使用道具 舉報(bào)

ID:404263 發(fā)表于 2022-5-6 11:46 | 顯示全部樓層
munuc_w 發(fā)表于 2022-5-5 08:33
HAL的接收函數(shù)太繁瑣,可以自己寫一個(gè)接收函數(shù),中斷調(diào)用,回調(diào)函數(shù)是在中斷中調(diào)用的,中斷中不易處理數(shù)據(jù) ...

大哥你這個(gè)說對了,自己單獨(dú)寫一個(gè)就沒問題,HAL_UART_IRQHandler(&huart5);hal庫這個(gè)函數(shù)處理的太繁瑣了,我168M主頻的都有幾率在下一個(gè)數(shù)據(jù)來前處理不完
回復(fù)

使用道具 舉報(bào)

ID:404263 發(fā)表于 2022-5-6 11:48 | 顯示全部樓層
問題解決了,HAL_UART_IRQHandler(&huart5);hal庫這個(gè)函數(shù)處理的時(shí)間太長了,我波特率115200一次性發(fā)多個(gè)數(shù)據(jù)后可能會在兩個(gè)數(shù)據(jù)間隔時(shí)間內(nèi)處理不完,導(dǎo)致丟失一個(gè)數(shù)據(jù),解決方法,自己寫一個(gè)中斷函數(shù)不要使用回調(diào)了,void UART5_IRQHandler(void)
{
  /* USER CODE BEGIN UART5_IRQn 0 */
        if(((UART5->SR) & USART_SR_RXNE) != RESET)                     //判斷讀取不為空標(biāo)志
        {
                Rxd[Count] = (unsigned char)(UART5->DR & 0x000000ff);        //讀取對應(yīng)數(shù)據(jù)
                UART5->DR = (unsigned long)Rxd[Count];                       //發(fā)送數(shù)據(jù)
                __HAL_UART_ENABLE_IT(&huart5, UART_IT_TXE);                  //打開發(fā)送空中斷
                Count++;
                if(Count >= 35)
                {
                        Count = 0;
                }
                UART5->SR &= ~UART_FLAG_RXNE;                                //清除讀取不為空標(biāo)志
        }
       
        if(((UART5->SR) & USART_SR_TXE) != RESET)                      //判斷發(fā)送空標(biāo)志
        {
                UART5->SR &= ~USART_SR_TXE;                                  //清除標(biāo)志
                __HAL_UART_DISABLE_IT(&huart5, UART_IT_TXE);                 //關(guān)閉發(fā)送中斷
        }
  /* USER CODE END UART5_IRQn 0 */
//  HAL_UART_IRQHandler(&huart5);
  /* USER CODE BEGIN UART5_IRQn 1 */

  /* USER CODE END UART5_IRQn 1 */
}
回復(fù)

使用道具 舉報(bào)

ID:404263 發(fā)表于 2022-5-6 11:50 | 顯示全部樓層
這個(gè)問題解決了,就是因?yàn)閔al庫這個(gè)回調(diào)函數(shù)處理時(shí)間太長了HAL_UART_IRQHandler(&huart5);我波特率為115200,兩個(gè)數(shù)據(jù)間隔的時(shí)間有可能處理不完這個(gè)函數(shù),導(dǎo)致會丟失一個(gè)數(shù)據(jù),解決方法就是自己寫一個(gè)中斷函數(shù),這樣就不會漏數(shù)據(jù)或者觸發(fā)ORE中斷了
void UART5_IRQHandler(void)
{
  /* USER CODE BEGIN UART5_IRQn 0 */
        if(((UART5->SR) & USART_SR_RXNE) != RESET)                     //判斷讀取不為空標(biāo)志
        {
                Rxd[Count] = (unsigned char)(UART5->DR & 0x000000ff);        //讀取對應(yīng)數(shù)據(jù)
                UART5->DR = (unsigned long)Rxd[Count];                       //發(fā)送數(shù)據(jù)
                __HAL_UART_ENABLE_IT(&huart5, UART_IT_TXE);                  //打開發(fā)送空中斷
                Count++;
                if(Count >= 35)
                {
                        Count = 0;
                }
                UART5->SR &= ~UART_FLAG_RXNE;                                //清除讀取不為空標(biāo)志
        }
       
        if(((UART5->SR) & USART_SR_TXE) != RESET)                      //判斷發(fā)送空標(biāo)志
        {
                UART5->SR &= ~USART_SR_TXE;                                  //清除標(biāo)志
                __HAL_UART_DISABLE_IT(&huart5, UART_IT_TXE);                 //關(guān)閉發(fā)送中斷
        }
  /* USER CODE END UART5_IRQn 0 */
//  HAL_UART_IRQHandler(&huart5);
  /* USER CODE BEGIN UART5_IRQn 1 */

  /* USER CODE END UART5_IRQn 1 */
}
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表