嵌入式应用编程经验之谈-STM32串口应用

    近年二维码应用越来越广泛,针对市场需求公司在原有的系统之上增加二维码访客功能。这里自己主要负责基于硬件(主控STM32F101)二维码数据的解密和数据传输功能,   这里硬件上需要需要三个串口。这对于这块主控来说也是很轻松的事情。在代码实现过程中很快自己发现了问题。

   问题描述:

     当我同时用两个串口时,发现两个串口不能同时正常工作。一个串口打印,一个串口用于485数据传输。只要开了打印功能485传输虽然有数据但是数据错误。

   解决过程:

     这里先是查看自己的串口初始化设置,反复查看一直没能发现问题所在,以及在网上查看各种帖子也没能找到问题所在。这里很庆幸有很多朋友都在网上分享自己的经验,这也让自己在解决问题的同时,学习到了很多东西。这里传承前辈们的精神,今后也将持续把自己的工作调试经验分享。

   BUG所在:

      这里在调试过程中自己用一个串口用于打印调试信息,一个串口接收有效数据。这里为了看到是否成功进入接收中断以及看到接收的数据。在接收中断函数里面用了      打印函数,也就是说我在一个串口接收函数中,用了另外一个串口的发送函数。通过反复查找发现正式因为这个函数导致,用于485数据通信的串口无法正常工作。、

  学习总结:

    这里告诉我们当我们在中断函数中,进行操作的时候应该格外注意。我们应该把许多的处理都放在中断函数外,尽量让中断函数尽可能的少做处理,提高代码的健壮性。


  串口初始化:

   这里记录下之前再调试串口时,发现串口通信经常会莫名奇妙便没有反应,这里最后发现因为串口初始化的问题,这里平时也没有太多关注IO口相关初始化的各种设置。下面直接贴出代码


下面是有问题的初始化:

  	        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;							//Tx
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
		GPIO_Init(GPIOA, &GPIO_InitStructure);
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;						//Rx
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;      //出问题的初始化
		GPIO_Init(GPIOA, &GPIO_InitStructure);   

修复的串口初始化:

         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;							//Tx
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;						//Rx
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;   //OK的初始化
	GPIO_Init(GPIOA, &GPIO_InitStructure);
我想对于任何一种IO口的模式大家都应该去弄清楚各种模式下的区别,什么情况下用那种模式。






 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值