怎么通过UART串口接收多个字符?

希望功能:在这里我想通过上位机向单片机发送2835,并通过串口返回,而我能通过数码管分别显示2835这四个数字。
现在的情况:四个数码管显示的都是5,她们都显示四个数字的最后一位,比如2834,就都显示4;
问题1:这里的RxdData数组里每个元素分别是字符2、8、3、5吗?如果不是那她们都是什么?
问题2:该怎么改才能实现上述功能?

每接收一个字符,单片机就会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.
我只能这样解释了,你花点时间想想我说的话吧,多自己想,收获会更多,更有体会。加油。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-04-02
会不会是数码管显示程序有问题,以前我刚刚学单片机的时候控制4位数码管动态显示1234,结果都是4,,,,,
第2个回答  2022-12-04
把变量i定义为静态变量“static unsigned char i;”之后应该也可以,不过用法上要改变一点了,未经验证,希望指正。
void UART_send() interrupt 4

{static unsigned char i=0;
if(RI) { if(i==4){i=0;}
RxData[i]=SBUF;

SBUF=RxData[i];

i++; }
if(TI){TI=0;}
}
相似回答