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

查看: 11207|回复: 32

[STM32F3] 【Nucleo-F303RE开发】UART中断发送数据

  [复制链接]

40

主题

1595

回帖

1

蝴蝶豆

论坛元老

最后登录
2018-7-23
发表于 2015-5-27 23:44:03 | 显示全部楼层 |阅读模式
首先感谢各位朋友们的帮助,白天在论坛里问的关于UART中断发送数据丢失问题的帖子。晚上有查了代码,看了HAL库代码和帮助文档,还有串口工具等问题,最终把问题解决了,把心得给大家分享一下。
关于问题,详细描述,可以看我的帖子:
【Nucleo-F303RE开发】关于UART中断发送丢失数据问题请教
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=601828&fromuid=336767
(出处: 意法半导体STM32/STM8技术社区)

一、解决:
其实我写的代码本身没有太大问题,问题出现在我用的串口工具。
1、白天描述的UART连续发2个字符串,但只显示1个字符串。
103.jpg
其实2个字符串都已经发送,但是串口没有显示出来而已,我把显示方式切换到十六进制数时,就可以看到数据要比显示的多,是第一个和第二个字符串都有。
104.jpg
应该问题出现在那个00上,每一个字符串结束标示符,我程序中发送时,是吧整个字符串,连同结束标识一块都发送出去了,而这个串口调试助手在这里可能显示有问题。
我把程序改成这样,每次发送字符串时,串口中断发送字符串长度为原来长度减1.
105.jpg
结果重新运行,就可以显示2个字符串了。
102.jpg
2、其实换一个串口调试助手也可以看到此类问题:
101.jpg
结论,看来一个好的调试工具非常重要。

二、总结
接下来总结一下HAL库中串口UART中断发送数据的编程方法,给朋友们一起共享一下:
第一步:填充串口结构体变量huart2,使用HAL_UART_Init()函数初始化串口
  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);
复制代码
第二步:在需要发送数据时调用HAL_UART_Transmit_IT()函数启动发送数据。
  1.     HAL_UART_Transmit_IT(&huart2, (uint8_t *)TxBuffer1, TXBUFFERSIZE1 - 1);
复制代码
第三步:串口自动启动发送中断,当每次中断时,自动进入中断USART2_IRQHandler()函数,调用库中的HAL_UART_IRQHandler()函数,这个函数不用大家编写,由库已经写好。
  1. void USART2_IRQHandler(void)
  2. {
  3.   HAL_UART_IRQHandler(&huart2);
  4. }
复制代码
第四步:当串口中断发送完所有需要发送的数据时,自动调用HAL_UART_TxCpltCallback()这个串口发送完成的回调函数。在这里大家写上自己的串口发送完毕的处理事件,当然我这里将自定义的标志置位。
  1. void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
  2. {
  3.   UartReady = SET;
  4. }
复制代码
第五步:在主函数中,启动发送数据HAL_UART_Transmit_IT()函数后,要判断数据是否发送完成,即UartReady标志,当发现置1即知道数据发送完毕,之后清标志位,就可以进行下一次发送了。
  1.    while (UartReady != SET)
  2.     {
  3.       ;
  4.     }
  5.     UartReady = RESET;
复制代码

最后把我修改后的程序上传上来:
UART_LED.rar (6.74 MB, 下载次数: 1058)

评分

参与人数 2ST金币 +21 收起 理由
wzbb2011 + 1 正在调试UART,遇到了类似的问题,受教了.
zero99 + 20

查看全部评分

<
回复

使用道具 举报

0

主题

14

回帖

0

蝴蝶豆

初级会员

最后登录
2018-1-23
发表于 2015-5-29 00:04:27 来自手机 | 显示全部楼层
多谢,分享棒棒的
回复 支持 0 反对 1

使用道具 举报

7

主题

190

回帖

0

蝴蝶豆

金牌会员

最后登录
2018-9-30
发表于 2015-5-27 23:55:27 | 显示全部楼层
,学习学习,谢谢分享!
回复 支持 反对

使用道具 举报

47

主题

3404

回帖

30

蝴蝶豆

版主

最后登录
2020-12-7
发表于 2015-5-27 23:56:48 | 显示全部楼层
多谢分享
回复 支持 反对

使用道具 举报

40

主题

1595

回帖

1

蝴蝶豆

论坛元老

最后登录
2018-7-23
 楼主| 发表于 2015-5-28 07:38:05 | 显示全部楼层
加拿大 发表于 2015-5-27 23:55
,学习学习,谢谢分享!

共同学习,
回复 支持 反对

使用道具 举报

26

主题

492

回帖

0

蝴蝶豆

金牌会员

最后登录
2018-11-11
发表于 2015-5-28 08:16:23 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

57

主题

1159

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-12-6
发表于 2015-5-28 08:20:47 | 显示全部楼层
谢谢                     
回复 支持 反对

使用道具 举报

40

主题

1595

回帖

1

蝴蝶豆

论坛元老

最后登录
2018-7-23
 楼主| 发表于 2015-5-28 08:44:40 | 显示全部楼层

共同学习哈
回复 支持 反对

使用道具 举报

2

主题

16

回帖

0

蝴蝶豆

新手上路

最后登录
2015-10-16
发表于 2015-5-28 08:54:08 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

307

主题

3125

回帖

0

蝴蝶豆

论坛元老

最后登录
2020-7-17
发表于 2015-5-28 09:01:36 | 显示全部楼层
good!
回复 支持 反对

使用道具 举报

100

主题

3617

回帖

1

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2015-5-28 09:16:31 | 显示全部楼层
顶一个,写的很详细
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版