OpenEdv-开源电子网

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

STM32串口中断数据存区求助

[复制链接]

4

主题

22

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2020-7-28
在线时间
10 小时
发表于 2020-8-6 19:51:32 | 显示全部楼层 |阅读模式
问题描述如下:
想通过串口接收十六进制数据,用来控制LED灯的点亮与延时,中断函数如下:
void USART1_IRQHandler(void)                        //串口1中断服务程序
{

                u8 c;
        u8 a;  
        u8 ch=0;
       
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
        {                  
                USART_RX_BUF[ch]=USART_ReceiveData(USART1);//(USART1->DR);        //读取接收到的数据
               
        USART_ClearITPendingBit(USART1,USART_IT_RXNE);
           ch++;
                 ch&= 0xc8;
        }
                 for(a=0;a<=200;a++ )
        {

if(USART_RX_BUF[a]==0xFF )                                                        //比较字符串
                {
                        c=USART_RX_BUF[a+1];
                        USART_SendData(USART1,c);
                        while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);       
                        GPIO_ResetBits(GPIOC,GPIO_Pin_1);                 
                  delay_ms(c);
                        GPIO_SetBits(GPIOC,GPIO_Pin_1);
                }       
USART_ClearFlag(USART1,USART_FLAG_TC);               
                }

        }

串口发送接收如图:发送是后来为了查看c的值加的,为什么能够识别FF,然后LED变成了常量,延时C没有作用,返回值确是00,求大佬指点一下

串口发送接收

串口发送接收
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2020-8-7 11:26:05 | 显示全部楼层
首先你的程序结构很有问题,中断里面处理太多事情了,不建议。
其次你的ch是局部变量,每次中断进来都会变成0,你做++没意义,一直存到buf[0]里面,所以后面判断没有任何意义。
回复 支持 反对

使用道具 举报

4

主题

22

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2020-7-28
在线时间
10 小时
 楼主| 发表于 2020-8-7 14:54:04 | 显示全部楼层
a5820736 发表于 2020-8-7 11:26
首先你的程序结构很有问题,中断里面处理太多事情了,不建议。
其次你的ch是局部变量,每次中断进来都会变 ...

朋友你好,你说的很对,我改了,还有个问题请教一下,USART_RX_BUF[a]这个数组的值怎么传递到主函数中去,我在.h文件中定义了extern,但是在中断函数中能取出数组的值,但是在主函数中不能取出数组的值
回复 支持 反对

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2020-8-7 15:49:44 | 显示全部楼层
这个建议你先学习c语言基础知识,我这边先告诉你解决方法。
在main或中断源文件中定义全局buf, 在对应头文件extern或者直接在另一个要用到的源文件extern,即可。
全局变量,局部变量,静态变量要弄清楚。
还有这个可以参考原子的源码,看懂人家的,才能应用到自己的代码中
回复 支持 反对

使用道具 举报

4

主题

22

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2020-7-28
在线时间
10 小时
 楼主| 发表于 2020-8-7 16:55:22 | 显示全部楼层
a5820736 发表于 2020-8-7 15:49
这个建议你先学习c语言基础知识,我这边先告诉你解决方法。
在main或中断源文件中定义全局buf, 在对应头文 ...

麻烦看一下这个http://www.openedv.com/thread-315185-1-1.html
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 17:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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