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

2019-07-21 04:59发布

此贴虽然简单,但是我的处女贴。本人从事程序开发和工业控制有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 ",BFT[j-1]);又会产生什么样的效果?



贴上图供大家参考,工业控制和产品开发都是在不断改进中得到更优方案,没有最优只有更优,因此态度决定一切,我们不管是学习还是做真正的工业系统,态度是第一位的,举个例子:一个系统要求7万平方米的温度控制到25度+-1度,要是给德国人和日本人来做这个项目,他们能做到25+-0.1-0.5度,给台湾人来做可能会控制到0.5-0.9这个范围。给中国人来做可能+-1度左右。扯远了,但是大家明白我说的什么意思 就行了,态度永远决定一切。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
drivewheel
1楼-- · 2019-07-21 06:33
呵呵你去测试一下,写程序其实写的多了经验也是很重要的!!!
drivewheel
2楼-- · 2019-07-21 09:00
 精彩回答 2  元偷偷看……
正点原子
3楼-- · 2019-07-21 11:33
不错,谢谢分享。。。
寒寒
4楼-- · 2019-07-21 12:04
请问,两个问题中,的效果是怎样的?平时写都是 buf[i++] = ch。会因为中断太快丢失某些数据吗?
zhang
5楼-- · 2019-07-21 17:20
谢谢楼主分享,本人菜鸟,在写接收不定长数据的串口程序,请问有什么好方法介绍
非常橙汁
6楼-- · 2019-07-21 20:26
楼主讲的不错,解决了我的一个困惑。

一周热门 更多>