大学生
最后登录1970-1-1
在线时间 小时
注册时间2016-8-4
|
在学习是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),然后程序就可以正常工作了。道理很简单,我就不多解释了。
嘿嘿,火哥,这个作业完成的怎么样?最后一个错误一般人发现不了哦!
|
|