嵌入式应用编程经验之谈-STM32串口应用
2016-11-10 10:39
274 查看
近年二维码应用越来越广泛,针对市场需求公司在原有的系统之上增加二维码访客功能。这里自己主要负责基于硬件(主控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口的模式大家都应该去弄清楚各种模式下的区别,什么情况下用那种模式。
问题描述:
当我同时用两个串口时,发现两个串口不能同时正常工作。一个串口打印,一个串口用于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口的模式大家都应该去弄清楚各种模式下的区别,什么情况下用那种模式。
相关文章推荐
- 状态机在嵌入式串口通信编程中的应用
- 嵌入式Linux串口应用编程
- 嵌入式应用编程经验之谈-ESP8266引脚中断编程
- 嵌入式成长轨迹28 【Linux应用编程强化】【中嵌第二阶段】【linux串口应用开发】
- 嵌入式Linux串口应用编程之串口配置
- 嵌入式Linux串口应用编程
- 嵌入式应用编程经验之谈-IAP(在线升级)
- 嵌入式应用编程经验之谈-局部变量造成的死机
- 嵌入式应用编程经验之谈-引脚复用
- 嵌入式应用编程经验之谈-as3911
- 嵌入式Linux串口应用编程之串口配置
- 嵌入式编程(以STM32为例)中的volatile,const意义及应用场景
- 转:嵌入式编程(以STM32为例)中的volatile,const意义及应用场景
- 嵌入式Linux串口应用编程基础知识
- 嵌入式成长轨迹19 【Linux应用编程强化】【Linux下的C编程 下】【进程操作】
- 嵌入式linux网络编程之connect()函数的高级应用
- 嵌入式成长轨迹24【Linux应用编程强化】【Linux下的C编程 下】【实例:Linux命令实现】
- 【Android应用开发】-(19)Android 串口编程原理和实现方式(附源码)
- 嵌入式成长轨迹20 【Linux应用编程强化】【Linux下的C编程 下】【进程间通信】
- 嵌入式linux串口编程