欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

Nucleo-F303RE UART中斷發(fā)送數(shù)據(jù)

[復(fù)制鏈接]
ID:127084 發(fā)表于 2016-6-17 21:05 | 顯示全部樓層 |閱讀模式
首先感謝各位朋友們的幫助,白天在論壇里問(wèn)的關(guān)于UART中斷發(fā)送數(shù)據(jù)丟失問(wèn)題的帖子。晚上有查了代碼,看了HAL庫(kù)代碼和幫助文檔,還有串口工具等問(wèn)題,最終把問(wèn)題解決了,把心得給大家分享一下。
關(guān)于問(wèn)題,詳細(xì)描述,可以看我的帖子:
【Nucleo-F303RE開(kāi)發(fā)】關(guān)于UART中斷發(fā)送丟失數(shù)據(jù)問(wèn)題請(qǐng)教

------------------------------------------------------------------
今天寫了一個(gè)UART的HAL庫(kù)中斷發(fā)送數(shù)據(jù)的程序,本來(lái)要發(fā)送兩個(gè)字符串,但是串口發(fā)送時(shí)只輸出了1個(gè)字符串,請(qǐng)問(wèn)大家程序出了什么問(wèn)題,請(qǐng)高手幫助解答。
如圖主程序:
每2秒循環(huán)發(fā)送2個(gè)字符串:
143730vq5l06upb4fatqal.jpg
但是串口接收的數(shù)據(jù)只有一個(gè)字符串:
143730bee78slteer6lsl9.jpg
主函數(shù)我把CUBEMX自動(dòng)生成的注釋給刪掉,看著短一些:
#include "stm32f3xx_hal.h"

UART_HandleTypeDef huart2;

#define TXBUFFERSIZE1                             COUNTOF(TxBuffer1)
#define TXBUFFERSIZE2                             COUNTOF(TxBuffer2)

#define COUNTOF(__BUFFER__)   (sizeof(__BUFFER__) / sizeof(*(__BUFFER__)))

static __IO ITStatus UartReady = RESET;
uint8_t TxBuffer1[] = "第一個(gè)字符串";
uint8_t TxBuffer2[] = “第二個(gè)字符串";


void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);

int main(void)
{

  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_USART2_UART_Init();
  while (1)
  {
    HAL_UART_Transmit_IT(&huart2, (uint8_t *)TxBuffer1, TXBUFFERSIZE1);
    while (UartReady != SET)
    {
      ;
    }
    UartReady = RESET;
   
    HAL_UART_Transmit_IT(&huart2, (uint8_t *)TxBuffer2, TXBUFFERSIZE2);
    while (UartReady != SET)
    {
      ;
    }
    UartReady = RESET;
   

    HAL_Delay(2000);

  }

}

void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_PeriphCLKInitTypeDef PeriphClkInit;

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);

  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;
  PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);

  __SYSCFG_CLK_ENABLE();

}

void MX_USART2_UART_Init(void)
{

  huart2.Instance = USART2;
  huart2.Init.BaudRate = 115200;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  huart2.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED ;
  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  HAL_UART_Init(&huart2);

}

void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __GPIOA_CLK_ENABLE();

  /*Configure GPIO pin : PA5 */
  GPIO_InitStruct.Pin = GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
  UartReady = SET;
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  UartReady = SET;
}

---------------------------------------------------
一、解決:
其實(shí)我寫的代碼本身沒(méi)有太大問(wèn)題,問(wèn)題出現(xiàn)在我用的串口工具。
1、白天描述的UART連續(xù)發(fā)2個(gè)字符串,但只顯示1個(gè)字符串。
231632l2o9bsg9gorjzbqx.jpg
其實(shí)2個(gè)字符串都已經(jīng)發(fā)送,但是串口沒(méi)有顯示出來(lái)而已,我把顯示方式切換到十六進(jìn)制數(shù)時(shí),就可以看到數(shù)據(jù)要比顯示的多,是第一個(gè)和第二個(gè)字符串都有。
231634ohwoh4paqv2t2wop.jpg
應(yīng)該問(wèn)題出現(xiàn)在那個(gè)00上,每一個(gè)字符串結(jié)束標(biāo)示符,我程序中發(fā)送時(shí),是吧整個(gè)字符串,連同結(jié)束標(biāo)識(shí)一塊都發(fā)送出去了,而這個(gè)串口調(diào)試助手在這里可能顯示有問(wèn)題。
我把程序改成這樣,每次發(fā)送字符串時(shí),串口中斷發(fā)送字符串長(zhǎng)度為原來(lái)長(zhǎng)度減1.
231638nijrjokdsy65fyyr.jpg
結(jié)果重新運(yùn)行,就可以顯示2個(gè)字符串了。
231631rbyrm7kyw6yz7yyw.jpg
2、其實(shí)換一個(gè)串口調(diào)試助手也可以看到此類問(wèn)題:
231630tozt5vt4gmbsotpe.jpg
結(jié)論,看來(lái)一個(gè)好的調(diào)試工具非常重要。

二、總結(jié)
接下來(lái)總結(jié)一下HAL庫(kù)中串口UART中斷發(fā)送數(shù)據(jù)的編程方法,給朋友們一起共享一下:
第一步:填充串口結(jié)構(gòu)體變量huart2,使用HAL_UART_Init()函數(shù)初始化串口
  1. huart2.Instance = USART2;
  2.   huart2.Init.BaudRate = 115200;
  3.   huart2.Init.WordLength = UART_WORDLENGTH_8B;
  4.   huart2.Init.StopBits = UART_STOPBITS_1;
  5.   huart2.Init.Parity = UART_PARITY_NONE;
  6.   huart2.Init.Mode = UART_MODE_TX;
  7.   huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  8.   huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  9.   huart2.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED ;
  10.    huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  11.   HAL_UART_Init(&huart2);
復(fù)制代碼
第二步:在需要發(fā)送數(shù)據(jù)時(shí)調(diào)用HAL_UART_Transmit_IT()函數(shù)啟動(dòng)發(fā)送數(shù)據(jù)。
HAL_UART_Transmit_IT(&huart2, (uint8_t *)TxBuffer1, TXBUFFERSIZE1 - 1);

第三步:串口自動(dòng)啟動(dòng)發(fā)送中斷,當(dāng)每次中斷時(shí),自動(dòng)進(jìn)入中斷USART2_IRQHandler()函數(shù),調(diào)用庫(kù)中的HAL_UART_IRQHandler()函數(shù),這個(gè)函數(shù)不用大家編寫,由庫(kù)已經(jīng)寫好。
  1.     void USART2_IRQHandler(void)
  2.     {
  3.       HAL_UART_IRQHandler(&huart2);
  4.     }
復(fù)制代碼
第四步:當(dāng)串口中斷發(fā)送完所有需要發(fā)送的數(shù)據(jù)時(shí),自動(dòng)調(diào)用HAL_UART_TxCpltCallback()這個(gè)串口發(fā)送完成的回調(diào)函數(shù)。在這里大家寫上自己的串口發(fā)送完畢的處理事件,當(dāng)然我這里將自定義的標(biāo)志置位。
  1.     void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
  2.     {
  3.       UartReady = SET;
  4.     }
復(fù)制代碼
第五步:在主函數(shù)中,啟動(dòng)發(fā)送數(shù)據(jù)HAL_UART_Transmit_IT()函數(shù)后,要判斷數(shù)據(jù)是否發(fā)送完成,即UartReady標(biāo)志,當(dāng)發(fā)現(xiàn)置1即知道數(shù)據(jù)發(fā)送完畢,之后清標(biāo)志位,就可以進(jìn)行下一次發(fā)送了。
  1.        while (UartReady != SET)
  2.         {
  3.           ;
  4.         }
  5.         UartReady = RESET;
復(fù)制代碼

最后把我修改后的程序上傳上來(lái):
UART_LED.rar (6.74 MB, 下載次數(shù): 24)
回復(fù)

使用道具 舉報(bào)

ID:185641 發(fā)表于 2017-4-2 18:58 | 顯示全部樓層
這個(gè)需要看看
回復(fù)

使用道具 舉報(bào)

ID:280567 發(fā)表于 2018-1-29 17:15 | 顯示全部樓層
謝謝分享~
回復(fù)

使用道具 舉報(bào)

ID:602141 發(fā)表于 2019-8-20 22:01 | 顯示全部樓層
正在學(xué)習(xí)中,感謝分享!!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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