搜索
查看: 5549|回复: 16

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

[复制链接]

该用户从未签到

40

主题

1635

帖子

1

蝴蝶豆

论坛元老

最后登录
2018-7-23
发表于 2015-5-27 14:42:22 | 显示全部楼层 |阅读模式
本帖最后由 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)
回复

使用道具 举报

该用户从未签到

25

主题

1029

帖子

17

蝴蝶豆

论坛元老

最后登录
2021-7-26
发表于 2015-5-27 14:49:24 | 显示全部楼层
有种可能是在第一次发送的过程中 发生了复位 .于是没有机会执行第二次发送
回复 支持 反对

使用道具 举报

该用户从未签到

25

主题

1029

帖子

17

蝴蝶豆

论坛元老

最后登录
2021-7-26
发表于 2015-5-27 14:50:23 | 显示全部楼层
单步调试看看呢 ..看看程序的走向.
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

102

帖子

14

蝴蝶豆

高级会员

最后登录
2022-3-30
发表于 2015-5-27 15:10:18 | 显示全部楼层
希望楼主能进一步深入学习,共同进步
回复 支持 反对

使用道具 举报

该用户从未签到

27

主题

1912

帖子

42

蝴蝶豆

论坛元老

最后登录
2022-7-11
发表于 2015-5-27 15:16:57 | 显示全部楼层
估计发送太快了吧。
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

318

帖子

0

蝴蝶豆

高级会员

最后登录
2016-3-23
发表于 2015-5-27 15:17:12 | 显示全部楼层
建议楼主在第一次和第二次之间增加一个LED反转并延时的语句,这样可以确定地看到程序在执行还是死了
回复 支持 反对

使用道具 举报

该用户从未签到

26

主题

871

帖子

0

蝴蝶豆

金牌会员

最后登录
2018-9-27
发表于 2015-5-27 15:34:19 | 显示全部楼层
ts2000 发表于 2015-5-27 15:16
估计发送太快了吧。

经测试,楼主这确实是发送太快了
回复 支持 反对

使用道具 举报

该用户从未签到

26

主题

871

帖子

0

蝴蝶豆

金牌会员

最后登录
2018-9-27
发表于 2015-5-27 15:34:47 | 显示全部楼层
楼主在两次发送之间增加HAL_Delay(10);即可
回复 支持 反对

使用道具 举报

该用户从未签到

133

主题

4688

帖子

239

蝴蝶豆

版主

最后登录
2021-4-10
发表于 2015-5-27 16:07:43 | 显示全部楼层
楼主是想通过UartReady 来控制,UartReady 要在发送完毕再赋值。
回复 支持 反对

使用道具 举报

该用户从未签到

12

主题

30

帖子

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2015-5-27 18:02:42 | 显示全部楼层
装金币啊
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-5-2 13:50 , Processed in 1.200918 second(s), 42 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表