OpenEdv-开源电子网

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

小白求助!串口怎么接收字符串?

[复制链接]

22

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
246
金钱
246
注册时间
2018-8-1
在线时间
43 小时
发表于 2019-3-14 18:32:31 | 显示全部楼层 |阅读模式
30金钱
我用的蓝牙模块,想接收串口助手发送给蓝牙的字符串,
假如串口助手发送"stm32"的话会进入几次中断?

下面是我的串口中断函数

u8 buf[50];

[mw_shl_code=c,true]

void USART1_IRQHandler(void)                        //串口1中断服务程序
{
        static u8 cnt = 0;
        u8 r;
        if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)  //接收中断
        {
                r =USART_ReceiveData(USART1);//读取接收到的数据
                buf[cnt++] = r;
                buf[cnt] = '\0';
                printf("%s",buf);
                if(r == '\r')
                cnt = 0;
//                while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
        }
        USART_ClearFlag(USART1,USART_FLAG_RXNE);
}        
[/mw_shl_code]

发送"stm32"第一次返回了ssmsm2,第二次发送"stm32"返回了sm2s

之后就再发就没反应了。。
不明白怎么回事

接收字符串

最佳答案

查看完整内容[请看2#楼]

终于找到问题了,有个外部中断优先级比串口中断高,把外部中断优先级调低就好了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
246
金钱
246
注册时间
2018-8-1
在线时间
43 小时
 楼主| 发表于 2019-3-14 18:32:32 | 显示全部楼层
nashui_sx 发表于 2019-3-14 19:39
那你直接蓝牙接usb串口,串口助手看看16进制数据就知道了

终于找到问题了,有个外部中断优先级比串口中断高,把外部中断优先级调低就好了
回复

使用道具 举报

22

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
246
金钱
246
注册时间
2018-8-1
在线时间
43 小时
 楼主| 发表于 2019-3-14 18:44:52 | 显示全部楼层
void USART1_IRQHandler(void)                        //串口1中断服务程序
{
        static u8 cnt = 0;
        u8 r;
        if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)  //接收中断
        {
                r =USART_ReceiveData(USART1);//(USART1->DR);        //读取接收到的数据
                buf[cnt++] = r;
                buf[cnt] = '\0';
                printf("%s",buf);
                if(r == '\r')
                cnt = 0;
//                while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
        }
        USART_ClearFlag(USART1,USART_FLAG_RXNE);
}


上面的代码显示好像有点问题
回复

使用道具 举报

21

主题

2205

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5141
金钱
5141
注册时间
2014-8-26
在线时间
1317 小时
发表于 2019-3-14 19:01:48 | 显示全部楼层
接收一个字节进一次中断
串口中断这块可以参考我们蓝牙例程
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-3-14 19:04:53 | 显示全部楼层
Gwvfbukn 发表于 2019-3-14 18:44
void USART1_IRQHandler(void)                        //串口1中断服务程序
{
        static u8 cnt = 0;

void USART1_IRQHandler(void)                        //串口1中断服务程序
{
                        static u8 cnt = 0;
                        u8 r;
                        if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)  //接收中断
                        {
                                                r =USART_ReceiveData(USART1);//(USART1->DR);        //读取接收到的数据
                                                buf[cnt++] = r;
                                                
                                                if(r == '\r')
                                                {
                                                        buf[cnt] = '\0';
                                                        printf("%s\r\n",buf);
                                                        cnt = 0;
                                                }
                                                USART_ClearFlag(USART1,USART_FLAG_RXNE);
                        }      
}
回复

使用道具 举报

22

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
246
金钱
246
注册时间
2018-8-1
在线时间
43 小时
 楼主| 发表于 2019-3-14 19:31:28 | 显示全部楼层
nashui_sx 发表于 2019-3-14 19:04
void USART1_IRQHandler(void)                        //串口1中断服务程序
{
                       ...

不能用,串口发数据完全没反应,大概会是哪里有问题呢
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-3-14 19:32:30 | 显示全部楼层
Gwvfbukn 发表于 2019-3-14 19:31
不能用,串口发数据完全没反应,大概会是哪里有问题呢

不可能,试过了肯定可以
回复

使用道具 举报

22

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
246
金钱
246
注册时间
2018-8-1
在线时间
43 小时
 楼主| 发表于 2019-3-14 19:37:09 | 显示全部楼层
nashui_sx 发表于 2019-3-14 19:04
void USART1_IRQHandler(void)                        //串口1中断服务程序
{
                       ...

感觉是蓝牙有问题,               
r =USART_ReceiveData(USART1);//(USART1->DR);        //读取接收到的数据
                USART_SendData(USART1,r);
回复

使用道具 举报

22

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
246
金钱
246
注册时间
2018-8-1
在线时间
43 小时
 楼主| 发表于 2019-3-14 19:37:31 | 显示全部楼层
nashui_sx 发表于 2019-3-14 19:04
void USART1_IRQHandler(void)                        //串口1中断服务程序
{
                       ...

这么改都不行
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-3-14 19:39:19 | 显示全部楼层

那你直接蓝牙接usb串口,串口助手看看16进制数据就知道了
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-3-14 22:05:37 | 显示全部楼层
Gwvfbukn 发表于 2019-3-14 21:54
终于找到问题了,有个外部中断优先级比串口中断高,把外部中断优先级调低就好了

那你外部中断函数也运行太长了吧
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2019-3-15 08:26:16 | 显示全部楼层
nashui_sx 发表于 2019-3-14 22:05
那你外部中断函数也运行太长了吧

外部中断肯定是延时消抖了
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

22

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
246
金钱
246
注册时间
2018-8-1
在线时间
43 小时
 楼主| 发表于 2019-3-15 14:36:07 | 显示全部楼层
szczyb1314 发表于 2019-3-15 08:26
外部中断肯定是延时消抖了

里面没又用延时,可能中断频率太高了?10ms进一次,感觉不高啊。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 04:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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