OpenEdv-开源电子网

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

串口通信问题求解

[复制链接]

2

主题

9

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2017-8-29
在线时间
5 小时
发表于 2017-8-29 08:53:45 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 zzp941010 于 2017-8-29 11:50 编辑

我在做一个项目的时候需要两块板子通过485进行串口通信,用于接收的板子需要在收到0x01后将接下来的八个字节数据放入数组,请问论坛各位大牛需要怎样写中断处理函数,新人小白在此谢过啦。我尝试着写了一下但是功能没有实现,程序如下






中断处理

中断处理

各位有经验的或者有想法的前辈帮忙给点建议吧@正点原子

串口.zip

6.02 MB, 下载次数: 159

最佳答案

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

int flag=0;拿出去定义为全局变量;或者在中断中定义为static int flag=0;
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

76

帖子

0

精华

高级会员

Rank: 4

积分
539
金钱
539
注册时间
2016-4-19
在线时间
139 小时
发表于 2017-8-29 08:53:46 | 显示全部楼层
int flag=0;拿出去定义为全局变量;或者在中断中定义为static int flag=0;
回复

使用道具 举报

115

主题

548

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2098
金钱
2098
注册时间
2013-11-27
在线时间
518 小时
发表于 2017-8-29 09:04:27 | 显示全部楼层
需要使用静态变量
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2017-8-29
在线时间
5 小时
 楼主| 发表于 2017-8-29 10:13:34 | 显示全部楼层
wanghy 发表于 2017-8-29 09:36
int flag=0;拿出去定义为全局变量;或者在中断中定义为static int flag=0;

还是不行的,用串口打印出来什么都没有
回复

使用道具 举报

13

主题

76

帖子

0

精华

高级会员

Rank: 4

积分
539
金钱
539
注册时间
2016-4-19
在线时间
139 小时
发表于 2017-8-29 10:20:11 | 显示全部楼层
zzp941010 发表于 2017-8-29 10:13
还是不行的,用串口打印出来什么都没有

你把3个int变量都拿出去做全局变量试一下
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2017-8-29
在线时间
5 小时
 楼主| 发表于 2017-8-29 10:50:11 | 显示全部楼层
wanghy 发表于 2017-8-29 10:20
你把3个int变量都拿出去做全局变量试一下

好绝望。。。。还是不行
回复

使用道具 举报

13

主题

76

帖子

0

精华

高级会员

Rank: 4

积分
539
金钱
539
注册时间
2016-4-19
在线时间
139 小时
发表于 2017-8-29 10:54:51 | 显示全部楼层
zzp941010 发表于 2017-8-29 10:50
好绝望。。。。还是不行

你把工程发上来让大家看下
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2017-8-29
在线时间
5 小时
 楼主| 发表于 2017-8-29 11:51:35 | 显示全部楼层
目前调试到这一步
回复

使用道具 举报

10

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2017-7-27
在线时间
98 小时
发表于 2017-8-29 12:52:09 | 显示全部楼层
本帖最后由 huanghan 于 2017-8-30 08:06 编辑

如果你的串口配置没问题,这样就可以实现 static u8 flag=0;
u8 buffer[9]={0};
u8 Rxbuffer[8]={0};
u8 Res=0;
void USART1_IRQHandler(void)
{

  if(USART_GetITSatus(USART1,USART_IT_RXNE)!=RESET)
  {
          buffer[flag]=USART_ReceiveData(USART1);
         if(buffer[0]==0x01)
          {
               Res++;
          }
          else Res=0;      
   }

  if(Res==9)
  {
    flag=1;
     if(buffer[0]==0x01)
      {
        for(Res=0;  Res<8;  Res++)
         {
           Rxbuffer[Res] =buffer[flag]
           flag++;
          }
       }
     flag=0;
     Res=0;

   }
   USART_ClearITPendingBit(USART1, USART_IT_RXNE);
  }
}
回复

使用道具 举报

8

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
395
金钱
395
注册时间
2014-7-13
在线时间
58 小时
发表于 2017-8-29 14:40:50 | 显示全部楼层
按2楼的说法做就行了,flag,flag_begin加static,然后在flag_begin清零后,把flag也清零。不过我有个问题就是buffer这个数组你怎么传出去??
回复

使用道具 举报

0

主题

13

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2017-7-8
在线时间
9 小时
发表于 2017-8-29 14:56:00 | 显示全部楼层
串口接收一次一个字节,就是每个字节都要进一次中断,所以你需要定义静态变量或者全局变量,而不是你在中断里面定义的局部变量
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-15 05:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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