你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【Nucleo-F303RE开发】关于UART中断发送丢失数据问题请教

[复制链接]
lkl0305 提问时间:2015-5-27 14:42 /
本帖最后由 lkl0305 于 2015-5-27 14:43 编辑

今天写了一个UART的HAL库中断发送数据的程序,本来要发送两个字符串,但是串口发送时只输出了1个字符串,请问大家程序出了什么问题,请高手帮助解答。
如图主程序:
每2秒循环发送2个字符串:
201.jpg
但是串口接收的数据只有一个字符串:
202.jpg
主函数我把CUBEMX自动生成的注释给删掉,看着短一些:
#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[] = "第一个字符串\n";
uint8_t TxBuffer2[] = “第二个字符串\n";


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;
}
完整工程附上:
UART_LED.rar (6.7 MB, 下载次数: 45)
收藏 评论16 发布时间:2015-5-27 14:42

举报

16个回答
星辰一方 回答时间:2015-5-28 08:35:45
lkl0305 发表于 2015-5-27 21:27
多谢指导!是的,你的方法可以使用,但是这是问什么呢?肯定在库中能找到原因吧 ...

应该是可以连续发送的,你看下是不是发送函数内有开启和关闭相关寄存器的操作……我回头也去看下
lkl0305 回答时间:2015-5-27 21:27:20
星辰一方 发表于 2015-5-27 15:34
楼主在两次发送之间增加HAL_Delay(10);即可

多谢指导!是的,你的方法可以使用,但是这是问什么呢?肯定在库中能找到原因吧
lkl0305 回答时间:2015-5-27 19:27:22
harvardx 发表于 2015-5-27 14:50
单步调试看看呢 ..看看程序的走向.

多谢指导!在2个UartReady = RESET;语句处设置断点,就可以执行到,全速运行执行不到的
harvardx 回答时间:2015-5-27 14:49:24
有种可能是在第一次发送的过程中 发生了复位 .于是没有机会执行第二次发送
harvardx 回答时间:2015-5-27 14:50:23
单步调试看看呢 ..看看程序的走向.
周蔷 回答时间:2015-5-27 15:10:18
希望楼主能进一步深入学习,共同进步
小小超 回答时间:2015-5-27 15:16:57
估计发送太快了吧。
jiaswang 回答时间:2015-5-27 15:17:12
建议楼主在第一次和第二次之间增加一个LED反转并延时的语句,这样可以确定地看到程序在执行还是死了
星辰一方 回答时间:2015-5-27 15:34:19
ts2000 发表于 2015-5-27 15:16
估计发送太快了吧。

经测试,楼主这确实是发送太快了
星辰一方 回答时间:2015-5-27 15:34:47
楼主在两次发送之间增加HAL_Delay(10);即可
废鱼 回答时间:2015-5-27 16:07:43
楼主是想通过UartReady 来控制,UartReady 要在发送完毕再赋值。
上达到 回答时间:2015-5-27 18:02:42
装金币啊
lkl0305 回答时间:2015-5-27 19:08:24
occupy 发表于 2015-5-27 15:10
希望楼主能进一步深入学习,共同进步

呵呵,多谢。共同学习,共同进步
寂寞如她 回答时间:2015-5-27 20:05:05
代码贴出来看一下
lkl0305 回答时间:2015-5-27 21:28:33

已上主函数代码和整个工程代码。多谢
12下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版