野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 41479|回复: 19

USART串口作业完成经验报告

[复制链接]
发表于 2016-9-4 16:41:38 | 显示全部楼层 |阅读模式
    在学习是USART串口中,最后火哥留了一个作业,就是当发送的数据是16进制发送的时候应该怎么写,是否还能用getchar()函数?
    答案是不能用getchar()函数了,可以通过串口中断来完成这个控制LED灯的功能。
    在我第一次调试的时候,首先将串口中断打开,然后定义全局变量,再将全局变量ucTemp付值ch,当然也要把case '1'改为case 1,就是去掉单引号,下载printf()函数
也稍微改下,由字符型改成整数型。这样改好后下载程序,结果打开串口会一直输出00000.....,串口会卡死,最后屏蔽printf()再发送16进制数可以正常控制;也就是说串口显示不正常。
   重点来了,再屏蔽了printf()之后,不小心发送了一个16进制的22,结果串口有显示了,发送1,2,3就没有显示,忽然想起来了没有勾选16进制显示,1,2,3如果不是16进制显示则没有对应值,勾选后正常的显示出来了。
   那么问题来了,为什么屏蔽了printf()之后还能显示呢?在看电子书的时候书中讲到了中断那里,书中原话是使用if语句来判断是否是真的产生USART数据接收这个中断事件,如果是真的就使用USART数据读取函数USART_ReceiveData读取数据到指定存储区。然后再调用USART数据发送函数USART_SendData把数据又发送给源设备,即PC端的串口调试助手,即通过中断里面USART_SendData()语句讲数据发送到了串口上,不需要再写printf()语句了。
   最后一个意外收获,视频中中断的语句是这个函数:if(USART_GetFlagStatus(DEBUG_USARTx,USART_FLAG_RXNE)!=RESET),可以正常工作,书中189页用的是
if (USART_GetITStatus(USARTx,USART_IT_RXNE)!=RESET)这个语句,并在这段代码后面稍微介绍了两个函数的相似用法及区别,为了验证他的正确性,我按照书中给的
改了代码,结果程序不工作了,但是我知道函数的问题不大,将书中的!=改外==,即if (USART_GetITStatus(USARTx,USART_IT_RXNE)==RESET),然后程序就可以正常工作了。道理很简单,我就不多解释了。
    嘿嘿,火哥,这个作业完成的怎么样?最后一个错误一般人发现不了哦!
   

串口中断函数

串口中断函数

定义全局变量

定义全局变量

定义变量,给ch复制

定义变量,给ch复制
回复

使用道具 举报

发表于 2016-9-4 17:07:00 | 显示全部楼层
66666,用心了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-4 17:40:28 | 显示全部楼层

火哥哥和火哥是什么关系啊
回复 支持 反对

使用道具 举报

发表于 2016-9-4 18:58:03 | 显示全部楼层
spligesh 发表于 2016-9-4 17:40
火哥哥和火哥是什么关系啊

我是火哥的粉丝
回复 支持 反对

使用道具 举报

发表于 2016-9-5 10:00:20 | 显示全部楼层
顶一个,学的不错啊
回复 支持 反对

使用道具 举报

发表于 2016-9-5 10:13:51 | 显示全部楼层
学的不错,很好,再接再厉。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-5 10:15:15 | 显示全部楼层
fire 发表于 2016-9-5 10:13
学的不错,很好,再接再厉。

谢谢火哥鼓励,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-5 10:15:57 | 显示全部楼层

嘿嘿,加油,现在网上学习比学校还好i啊
回复 支持 反对

使用道具 举报

发表于 2016-9-5 11:54:35 | 显示全部楼层
spligesh 发表于 2016-9-5 10:15
嘿嘿,加油,现在网上学习比学校还好i啊

你是肯定的,学校是啥教育啊。现在大学本科里面的课程,放到初中都可以学。
网上不是流传一副图吗,讲的是动漫叮当在做小学作业的时候,网友发现里面的题目是大学里面的电路的题目。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-5 18:27:47 | 显示全部楼层
许亮 发表于 2016-9-5 11:54
你是肯定的,学校是啥教育啊。现在大学本科里面的课程,放到初中都可以学。
网上不是流传一副图吗,讲的 ...

哈哈,说的有道理
回复 支持 反对

使用道具 举报

发表于 2016-12-8 21:55:27 | 显示全部楼层
楼主照你的法方改了,为什么不能控制呢?
回复 支持 反对

使用道具 举报

发表于 2017-2-7 19:17:51 | 显示全部楼层
小东 发表于 2016-12-8 21:55
楼主照你的法方改了,为什么不能控制呢?

hex输入时,有的串口助手需要输入:01,光输入1不行。我的就是这个问题。
回复 支持 1 反对 0

使用道具 举报

发表于 2017-11-15 17:23:16 | 显示全部楼层
我也是没有屏蔽printf函数,所以串口一直死,看了楼主的贴才明白怎么回事,非常感谢咯!
回复 支持 反对

使用道具 举报

发表于 2018-4-25 15:21:34 | 显示全部楼层
但是我刚刚测试用的是SART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET;如果改成==就不可以了。不知道为什么?
回复 支持 反对

使用道具 举报

发表于 2019-4-9 16:37:58 | 显示全部楼层
厉害厉害厉害
回复 支持 反对

使用道具 举报

发表于 2020-4-9 11:40:53 | 显示全部楼层
我的中断服务函数依然是中断事件标志位,但是我要输入01才能亮,1不行
回复 支持 反对

使用道具 举报

发表于 2021-2-6 20:28:54 | 显示全部楼层
小白向楼主学习!
回复 支持 反对

使用道具 举报

发表于 2021-3-1 18:05:11 | 显示全部楼层
本帖最后由 天空的颜色 于 2021-3-1 18:12 编辑

为什么我的定义全局变量后,屏蔽掉了printf函数,串口调试助手一直在打印Show_Message()函数里的,然后串口调试助手还会卡死,电脑上任务栏都自动从默认放在下面,变成放在右边了。
怕电脑被玩坏,每次都马上关掉板子开关。但是关掉Show_Mseeage()函数就可以了。
回复 支持 反对

使用道具 举报

发表于 2021-7-10 21:55:41 | 显示全部楼层
兄弟,你太牛了
回复 支持 反对

使用道具 举报

发表于 2022-11-18 15:09:43 | 显示全部楼层
太毒了,我要输入01才行
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 15:07 , Processed in 0.061827 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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