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

查看: 11203|回复: 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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版