怎么通过UART串口接收多个字符?
希望功能:在这里我想通过上位机向单片机发送2835,并通过串口返回,而我能通过数码管分别显示2835这四个数字。现在的情况:四个数码管显示的都是5,她们都显示四个数字的最...
希望功能:在这里我想通过上位机向单片机发送2835,并通过串口返回,而我能通过数码管分别显示2835这四个数字。
现在的情况:四个数码管显示的都是5,她们都显示四个数字的最后一位,比如2834,就都显示4;
问题1:这里的RxdData数组里每个元素分别是字符2、8、3、5吗?如果不是那她们都是什么?
问题2:该怎么改才能实现上述功能? 展开
现在的情况:四个数码管显示的都是5,她们都显示四个数字的最后一位,比如2834,就都显示4;
问题1:这里的RxdData数组里每个元素分别是字符2、8、3、5吗?如果不是那她们都是什么?
问题2:该怎么改才能实现上述功能? 展开
3个回答
展开全部
每接收一个字符,单片机就会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,以及缓冲数组RxdData_Buffer[],每接收一个字符,会进入中断,则RxdData_Buffer[count]=SBUF;同时count自加1;当四个字符全接收完时,count的值为4,则此时在main函数中将count清0,同时将RxdData_Buffer[]的全部值赋给RxdData[]。main函数中再通过调用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.
我只能这样解释了,你花点时间想想我说的话吧,多自己想,收获会更多,更有体会。加油。
展开全部
会不会是数码管显示程序有问题,以前我刚刚学单片机的时候控制4位数码管动态显示1234,结果都是4,,,,,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
把变量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;}
}
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;}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询