OpenEdv-开源电子网

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

STM32串口问题

[复制链接]

14

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2017-6-27
在线时间
48 小时
发表于 2017-9-7 10:55:09 | 显示全部楼层 |阅读模式
10金钱
串口接了超声波和RFID读取器,下载运行正常,但只要串口有数据传输(比如超声波测距、读到RFID标签),程序就会停止运行(在main函数里加了LED灯,串口有数据,LED灯就会停止闪烁)。这是为什么?是板子少了吗?

最佳答案

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

我建议,把printf从串口2中断处理函数中去掉,可以放在外面。。试一下。 而且你的fputc也用的串口2,你是想把串口2接收到的数据再通过串口2发送出去? while(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)!=RESET);这句本身就是没用的,假如你是等待发送结束,你也不应该获取接收状态寄存器。。 而且fputc里面已经对发送状态进行判断了,所以不管出于什么目的,这一句都是多余的。 在中断里面的操作还是得简单高效,尽量还是把 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2017-7-12
在线时间
26 小时
发表于 2017-9-7 10:55:10 | 显示全部楼层
我建议,把printf从串口2中断处理函数中去掉,可以放在外面。。试一下。
而且你的fputc也用的串口2,你是想把串口2接收到的数据再通过串口2发送出去?
while(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)!=RESET);这句本身就是没用的,假如你是等待发送结束,你也不应该获取接收状态寄存器。。
而且fputc里面已经对发送状态进行判断了,所以不管出于什么目的,这一句都是多余的。
在中断里面的操作还是得简单高效,尽量还是把printf挪出去,否则下一个中断到了,你这个中断处理还没完成,岂不是要丢失数据。。而且万一你同时打开了接收发送中断,那岂不是死循环?自己好好检查一下吧。。
回复

使用道具 举报

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2017-7-31
在线时间
31 小时
发表于 2017-9-7 11:31:42 | 显示全部楼层
有没有可能是没清除串口中断的标志位,导致不停的进入串口中断
回复

使用道具 举报

13

主题

85

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1897
金钱
1897
注册时间
2016-8-20
在线时间
238 小时
发表于 2017-9-7 11:34:26 | 显示全部楼层
中断处理有可能没做好
回复

使用道具 举报

14

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2017-6-27
在线时间
48 小时
 楼主| 发表于 2017-9-7 11:37:23 | 显示全部楼层
章鱼哥丶 发表于 2017-9-7 11:31
有没有可能是没清除串口中断的标志位,导致不停的进入串口中断

清除了的,之前可以用、忽然就不行了;
回复

使用道具 举报

14

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2017-6-27
在线时间
48 小时
 楼主| 发表于 2017-9-7 11:38:13 | 显示全部楼层
ChaserMCU 发表于 2017-9-7 11:34
中断处理有可能没做好

在线调试显示他一直卡在
//重定义fputc函数
int fputc(int ch, FILE *f)
{      
        while((USART2->SR&0X40)==0);  //循环发送,直到发送完毕   
  USART2->DR = (u8) ch;      
        return ch;
}

但把他去掉后,整个程序都不跑了。好奇怪啊。
回复

使用道具 举报

56

主题

520

帖子

0

精华

高级会员

Rank: 4

积分
964
金钱
964
注册时间
2014-11-18
在线时间
160 小时
发表于 2017-9-7 11:51:33 | 显示全部楼层
1061700625 发表于 2017-9-7 11:38
在线调试显示他一直卡在
//重定义fputc函数
int fputc(int ch, FILE *f)

可以使用单一测试法,就是把其中一个屏蔽先.

看看单独的是不是ok的.
自己选择的路,成家前走完。
回复

使用道具 举报

14

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2017-6-27
在线时间
48 小时
 楼主| 发表于 2017-9-7 11:53:42 | 显示全部楼层
aiyeba 发表于 2017-9-7 11:51
可以使用单一测试法,就是把其中一个屏蔽先.

看看单独的是不是ok的.

刚把所有的printf都注释掉,程序就能跑了;是串口出问题了吗?测io电压也正常的。
回复

使用道具 举报

56

主题

520

帖子

0

精华

高级会员

Rank: 4

积分
964
金钱
964
注册时间
2014-11-18
在线时间
160 小时
发表于 2017-9-7 11:58:22 | 显示全部楼层
1061700625 发表于 2017-9-7 11:53
刚把所有的printf都注释掉,程序就能跑了;是串口出问题了吗?测io电压也正常的。

你在反过来测试一下阿.就是单独测试一下打印是不是ok的.理论上串口打印是没啥问题的.

这个大家都用烂了的.


你把你的串口中断服务函数给大家看看就知道.




自己选择的路,成家前走完。
回复

使用道具 举报

14

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2017-6-27
在线时间
48 小时
 楼主| 发表于 2017-9-7 11:58:28 | 显示全部楼层
另外新写一个串口发送数据的程序烧进去,然后printf,也跑不出来;
回复

使用道具 举报

14

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2017-6-27
在线时间
48 小时
 楼主| 发表于 2017-9-7 11:59:45 | 显示全部楼层
aiyeba 发表于 2017-9-7 11:58
你在反过来测试一下阿.就是单独测试一下打印是不是ok的.理论上串口打印是没啥问题的.

这个大家都用烂 ...

void USART2_IRQHandler(void)                        //串口2中断服务程序
{
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  
                {
                  USART_ClearITPendingBit(USART2, USART_IT_RXNE);
                        receive_data = USART_ReceiveData(USART2);
                        while(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)!=RESET);
                        printf("receive_data: %d\r\n",receive_data);
     }
}
回复

使用道具 举报

14

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2017-6-27
在线时间
48 小时
 楼主| 发表于 2017-9-7 12:01:29 | 显示全部楼层
1061700625 发表于 2017-9-7 11:59
void USART2_IRQHandler(void)                        //串口2中断服务程序
{
        if(USART_GetITStatus(USART2, ...

需要printf的:

                if( (Cross_Flag==4 && ( DontGo_Flag==1 || Food_Flag==2 )) || ( Cross_Flag==5 && ( DontGo_Flag==1||Food_Flag==3 ) ) )
                {
//                        if(Cross_Flag==4 && Food_Flag==2)        printf("Road 4,the goods are Staple Foods, turn Right soon\r\n");
//      else if(Cross_Flag==4 && DontGo_Flag==1) printf("Road 4,Front distance is %f cm, turn Right soon\r\n",distance_mid);
//                        else if(Cross_Flag==5 && Food_Flag==3)   printf("Road 5,the goods are Meat,turn Right soon\r\n");
//      else if(Cross_Flag==5 && DontGo_Flag==1) printf("Road 5,Front distance is %f cm,turn Right soon\r\n",distance_mid);
//                        else printf("No abnormalities,go Straight\r\n");
                          TIM_PrescalerConfig(TIM3,59,TIM_PSCReloadMode_Immediate);//左轮转
                    TIM_PrescalerConfig(TIM4,0xffff,TIM_PSCReloadMode_Immediate);//右轮不转
                    delay_ms(1000);
                    while(ST188DATA==7);
                          Cross_Flag=0;
                }
回复

使用道具 举报

14

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2017-6-27
在线时间
48 小时
 楼主| 发表于 2017-9-7 12:03:27 | 显示全部楼层
之前是打印中文,但中文通过蓝牙发到手机上是乱码,就百度翻译成了英文的;然后就炸了,应该不会是这个原因吧
回复

使用道具 举报

12

主题

330

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2294
金钱
2294
注册时间
2016-5-21
在线时间
954 小时
发表于 2017-9-7 12:41:15 | 显示全部楼层
不用printf,自己写一个发送函数和接收函数;

//串口2发送
void u2_send(u8 *dat,u8 count)
{
  u8 i;
  for(i=0;i<count;i++)
  {
         while((USART2->SR&0X40)==0);
         USART2->DR=dat[i];
         while((USART2->SR&0X40)==0);
  }
}

//中断接收
void USART2_IRQHandler(void)
{
        if(USART2->SR&(1<<5))//接收到数据
        {         
                COUNT2%=64;
                Buf2[COUNT2++]=USART2->DR;
                RF2=1;
         }                                                                                 
}
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-9-7 13:28:06 | 显示全部楼层
这种现象现新手会经常出现.明天是程序的问题.
回复

使用道具 举报

56

主题

520

帖子

0

精华

高级会员

Rank: 4

积分
964
金钱
964
注册时间
2014-11-18
在线时间
160 小时
发表于 2017-9-7 13:43:39 | 显示全部楼层
1061700625 发表于 2017-9-7 11:59
void USART2_IRQHandler(void)                        //串口2中断服务程序
{
        if(USART_GetITStatus(USART2, ...

USART_ClearITPendingBit(USART2, USART_IT_RXNE);

while(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)!=RESET);

都是多余的.
自己选择的路,成家前走完。
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7568
金钱
7568
注册时间
2016-11-30
在线时间
643 小时
发表于 2017-9-7 13:56:24 | 显示全部楼层
中断里边尽量别用printf
回复

使用道具 举报

63

主题

238

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1136
金钱
1136
注册时间
2015-11-29
在线时间
146 小时
发表于 2017-9-7 16:16:28 | 显示全部楼层
应该不是停止运行了,是程序等待了。你看一下代码里面接收程序哪里是怎么处理的
回复

使用道具 举报

14

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2017-6-27
在线时间
48 小时
 楼主| 发表于 2017-9-7 22:46:57 | 显示全部楼层
谢大家~~mua!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 03:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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