怎么通过UART串口接收多个字符?
答案:2 悬赏:50 手机版
解决时间 2021-03-31 11:22
- 提问者网友:轮囘Li巡影
- 2021-03-31 00:22
怎么通过UART串口接收多个字符?
最佳答案
- 五星知识达人网友:夜余生
- 2021-03-31 01:46
每接收一个字符,单片机就会UART中断,在中断过程中,你把读取的那个SBUF字符,全部赋值给RxdData数组,比如你读取到的字符是0x01,那RxdData[0]-RxdData[3]均为0x01。由于你发送的是2835,当接收到2时,RxdData[0]-RxdData[3]均为2,当接收到8时RxdData[0]-RxdData[3]均为8,这也就是为什么他们都只显示四个数字的最后一位。
解决思路:
由于你发送的是四个数字,定义一个计数的全局变量count,以及缓冲数组RxdData_Buffer[],每接收一个字符,会进入中断,则RxdData_Buffer[count]=SBUF;同时count自加1;当四个字符全接收完时,count的值为4,则此时在main函数中将count清0,同时将RxdData_Buffer[]的全部值赋给RxdData[]。main函数中再通过调用RxdData[],实现数码管的显示。
好了,大致思路是这样,请采纳,点赞,给分。。。。。。追问还没有看懂,那你这样和下面有什么区别呢?还有为什么要在主函数里将count清0.
刚刚用你说的方法试了,真的可以!!但是我还是不明白为什么这样可以,我不用 将RxdData_Buffer[]的全部值赋给RxdData[] 也可以显示,这样好吗?
追答区别大呢,你的函数功能是,接收一个字符后,就对RxdData[]数组里的全部变量进行赋值,而且全部赋同一个值,这显然不是你要的,你期望的是:第一个字符接收后,就存在RxdData[0],第二个字符接收后,就存在RxdData[1],以此类推。全部接收完后,再调用RxdData[]数组,使数码管显示。
也可以在中断函数中清零count,不过你得想清楚逻辑,否则容易出错,清零count的原因:一、你定义的数组RxdData[]应该只有4个元素吧,当count=4时,RxdData[count]无意义;二、count的清零为下次接收4个字符数据做准备。
建议使用RxdData_Buffer[],它起一个缓冲作用,它保证了接收数据的完整性,这样的程序会更可靠。如果你不使用RxdData_Buffer[],而直接使用RxdData[],会存在一些问题,比如:当你输入2835时,数码管显示2835,没错,很正常,可是,当你再输入9124时呢?发送字符是有时间的,虽然时间很短,可能你才发送了91过去,而24还没来得及发送,这时,用RxdData[]中的数据应该是9135,所以数码管显示的是9135,而不是你的9124.
我只能这样解释了,你花点时间想想我说的话吧,多自己想,收获会更多,更有体会。加油。
解决思路:
由于你发送的是四个数字,定义一个计数的全局变量count,以及缓冲数组RxdData_Buffer[],每接收一个字符,会进入中断,则RxdData_Buffer[count]=SBUF;同时count自加1;当四个字符全接收完时,count的值为4,则此时在main函数中将count清0,同时将RxdData_Buffer[]的全部值赋给RxdData[]。main函数中再通过调用RxdData[],实现数码管的显示。
好了,大致思路是这样,请采纳,点赞,给分。。。。。。追问还没有看懂,那你这样和下面有什么区别呢?还有为什么要在主函数里将count清0.
刚刚用你说的方法试了,真的可以!!但是我还是不明白为什么这样可以,我不用 将RxdData_Buffer[]的全部值赋给RxdData[] 也可以显示,这样好吗?
追答区别大呢,你的函数功能是,接收一个字符后,就对RxdData[]数组里的全部变量进行赋值,而且全部赋同一个值,这显然不是你要的,你期望的是:第一个字符接收后,就存在RxdData[0],第二个字符接收后,就存在RxdData[1],以此类推。全部接收完后,再调用RxdData[]数组,使数码管显示。
也可以在中断函数中清零count,不过你得想清楚逻辑,否则容易出错,清零count的原因:一、你定义的数组RxdData[]应该只有4个元素吧,当count=4时,RxdData[count]无意义;二、count的清零为下次接收4个字符数据做准备。
建议使用RxdData_Buffer[],它起一个缓冲作用,它保证了接收数据的完整性,这样的程序会更可靠。如果你不使用RxdData_Buffer[],而直接使用RxdData[],会存在一些问题,比如:当你输入2835时,数码管显示2835,没错,很正常,可是,当你再输入9124时呢?发送字符是有时间的,虽然时间很短,可能你才发送了91过去,而24还没来得及发送,这时,用RxdData[]中的数据应该是9135,所以数码管显示的是9135,而不是你的9124.
我只能这样解释了,你花点时间想想我说的话吧,多自己想,收获会更多,更有体会。加油。
全部回答
- 1楼网友:胯下狙击手
- 2021-03-31 02:37
会不会是数码管显示程序有问题,以前我刚刚学单片机的时候控制4位数码管动态显示1234,结果都是4,,,,,
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯