OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 22718|回复: 19

《关于STM32串口中断服务函数的相关说明》

[复制链接]

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2014-11-1
在线时间
0 小时
发表于 2014-11-3 13:07:56 | 显示全部楼层 |阅读模式
此贴虽然简单,但是我的处女贴。本人从事程序开发和工业控制有5年的时间,对工业控制和上位下位有独特的理解,我们学习这些东西的目的主要是工业控制,系统开发,产品开发。因此对系统的可靠性在我的理解中是第一位的。最近看好多人对于STM32的串口中断服务程序搞的是一头雾水,所以发此贴以解决大家的疑惑。我之前写过很多VC/VB以及其他软件的串口程序,已经CRC16/CRC32等有名的串口检验程序算法(应用),记得有个项目是关于机器视觉的,想类似的软件对通信都有着比较严格的要求,接收和处理数据务必严格准确。说白了串口就是每次发8位数据,接收也是每次8位数据,STM32串口的中断服务函数中数据的处理好多人说为什么数据装不进去数组,STM32的中断也是没接收到8位就会产生中断。如下面程序:
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)


    USART_ClearITPendingBit(USART1,USART_IT_RXNE);
    ch=USART_ReceiveData(USART1);
    LED1( ON );  // 
    LED2( ON );  //
   LED3( ON );  // 
   printf("%c"ch);
   }
我们从串口调试助手看到的数据就是我们所发的数据,因为单片机中断速度非常快,因此这个过程在CPU内部已非常快的速度完成,宏观看到的数据其实就是我们所发的数据,然而在内部理解串口8位数据来解释这个过程,其实串口调试助手接收到的数据也是8位8位接收过来的。
我个人建议,中断服务程序我们只做存储数据就好,处理数据尽量去main里面处理,这样不容易产生混乱。
在中断服务函数中用全局变量作为整个软体的某些 数据处理标记,其他的工作都由main函数处理。下面是我改进的一个例子。
void USART1_IRQHandler(void)
{
  uint8_t ch;
extern uint8_t BFT[1000];
extern uint32_t j;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//


    USART_ClearITPendingBit(USART1,USART_IT_RXNE);
    ch=USART_ReceiveData(USART1);
    LED1( ON );  // 
    LED2( ON );  // 
    LED3( ON );  // 
    j=j+1;
   }
BFT[j-1]=ch;
printf("%c",BFT[j-1]);
}    
问题1:大家研讨一下如果把BFT[j]=ch放在j=j+1之前会产生什么样的效果?
问题2:如果把printf("%c",BFT[j-1]);改为printf("%c\n",BFT[j-1]);又会产生什么样的效果?



贴上图供大家参考,工业控制和产品开发都是在不断改进中得到更优方案,没有最优只有更优,因此态度决定一切,我们不管是学习还是做真正的工业系统,态度是第一位的,举个例子:一个系统要求7万平方米的温度控制到25度+-1度,要是给德国人和日本人来做这个项目,他们能做到25+-0.1-0.5度,给台湾人来做可能会控制到0.5-0.9这个范围。给中国人来做可能+-1度左右。扯远了,但是大家明白我说的什么意思 就行了,态度永远决定一切。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2014-11-1
在线时间
0 小时
 楼主| 发表于 2014-11-4 13:44:01 | 显示全部楼层
呵呵你去测试一下,写程序其实写的多了经验也是很重要的!!!
回复 支持 1 反对 0

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2014-11-1
在线时间
0 小时
 楼主| 发表于 2014-11-3 19:35:20 | 显示全部楼层
呵呵感谢支持。
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-11-3 18:35:48 | 显示全部楼层
不错,谢谢分享。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

19

主题

248

帖子

2

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2012-2-8
在线时间
19 小时
发表于 2014-11-3 20:10:09 | 显示全部楼层
请问,两个问题中,的效果是怎样的?平时写都是 buf[i++] = ch。会因为中断太快丢失某些数据吗?
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2013-10-9
在线时间
0 小时
发表于 2015-4-30 11:00:15 | 显示全部楼层
谢谢楼主分享,本人菜鸟,在写接收不定长数据的串口程序,请问有什么好方法介绍
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-9-18
在线时间
7 小时
发表于 2015-10-5 10:25:32 | 显示全部楼层
楼主讲的不错,解决了我的一个困惑。
回复 支持 反对

使用道具 举报

12

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
408
金钱
408
注册时间
2016-1-28
在线时间
72 小时
发表于 2016-4-18 16:30:46 | 显示全部楼层
很多事情往往是由态度决定的
回复 支持 反对

使用道具 举报

0

主题

63

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3867
金钱
3867
注册时间
2015-8-26
在线时间
285 小时
发表于 2016-4-18 17:42:29 | 显示全部楼层
先顶后看好习惯
回复 支持 反对

使用道具 举报

5

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2016-4-4
在线时间
39 小时
发表于 2016-9-22 11:22:31 | 显示全部楼层
午饭前的一个好贴   
回复 支持 反对

使用道具 举报

10

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2017-3-17
在线时间
38 小时
发表于 2017-3-20 00:15:23 来自手机 | 显示全部楼层
谢谢,正在写这块新手一个
回复 支持 反对

使用道具 举报

8

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2017-1-14
在线时间
48 小时
发表于 2017-3-20 00:56:26 来自手机 | 显示全部楼层
顶顶顶!
回复 支持 反对

使用道具 举报

34

主题

173

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1087
金钱
1087
注册时间
2017-3-10
在线时间
172 小时
发表于 2017-3-22 17:52:49 | 显示全部楼层
回复 支持 反对

使用道具 举报

头像被屏蔽

8

主题

95

帖子

0

精华

禁止发言

积分
349
金钱
349
注册时间
2016-12-8
在线时间
88 小时
发表于 2017-3-22 18:09:54 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6729
金钱
6729
注册时间
2017-5-22
在线时间
430 小时
发表于 2017-7-24 09:11:14 | 显示全部楼层
顶一下
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2016-8-19
在线时间
10 小时
发表于 2017-12-6 23:11:11 | 显示全部楼层
这几天也在搞这个,头大。楼主是发送8位,接收8位,问题我是发送接收都不确定。我试一下楼主的方法,谢啦
回复 支持 反对

使用道具 举报

0

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2018-2-28
在线时间
76 小时
发表于 2019-2-25 15:35:19 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2018-2-28
在线时间
76 小时
发表于 2019-2-25 15:35:44 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2019-7-25
在线时间
11 小时
发表于 2020-3-17 17:19:42 | 显示全部楼层
学习。。。。。。。。。。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2020-3-19
在线时间
3 小时
发表于 2021-6-24 17:47:06 | 显示全部楼层
楼主讲的不错
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 02:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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