我想通过串口发送字符串到单片机然后在返回,比如发送:0123456789ab 程序下载进去后第一次发送返回来的是0123456789a 再后面的发送就返回b0123456789a 请问这到底是怎么回事啊?
#include<reg52.h>
#define uint unsigned char
#define uchar unsigned int
uchar ser_receive; //串口接收到的数据
uchar ser_flag=0;
uchar receive_number[12]={0};
uchar i=0;
uchar j;
void init_ser()
{
TMOD=0X20;//定时器1工作在方式2
TH1=0XFD;
TL1=0XFD; //波特率9600
TR1=1;
EA=1;
SM0=0;
SM1=1;
REN=1;//允许串口接收
ES=1;//开串口 中断
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void ser() interrupt 4 //中断函数不用声明
{
if(RI==1)
{
RI=0;
ser_receive=SBUF;
if(ser_receive!='\0')
{
receive_number[i]=ser_receive;
i++;
if(i==12)
{
i=0;
ser_flag=1;
}
}
}
}
void main()
{
init_ser();
while(1)
{
if(ser_flag==1)
{
ES=0;
ser_flag=0;
for(j=0;j<12;j++)
{
SBUF=receive_number[j];
while(!TI);
TI=0;
delay(10);
}
ES=1;
}
}
}
------解决方案--------------------
你可以在线调试一下
------解决方案--------------------
可能是单片机的处理速度过慢
你把中断里的程序再精简一点或者提高单片机的晶振看看
------解决方案--------------------
少发点数据试试
------解决方案--------------------
程序大致看了下,应该没问题的。
楼主可以单个字符发送看看返回情况,如果单个程序发送情况正确,那就是单片机处理速度不够,其实单片机先接受一个字节,然后执行中断程序,然后返回主程序继续执行~这是好的情况,但一旦发送数据太快,在响应一个中断请求后,又有另一个中断请求了,那么在第一个中断函数执行完,就会执行第二个中断函数,并不会主函数,于是丢失数据。。。。。。
------解决方案--------------------
貌似前一次读了b 没发,在线调试,关键看第一个字符的发送
------解决方案--------------------
if(ser_receive!='\0')
{
receive_number[i]=ser_receive;
i++;
if(i==12){//请修改这里试试
i=0;
ser_flag=1;
}
}
------解决方案--------------------
================================================
很明显的问题: 为什么是b, 而不是c, d, e, f, 是不是还是你的累加结果被发出去了.
------解决方案--------------------
你用的晶振是多少的?建议使用11.0592MHZ
------解决方案--------------------
不能在线调试么?不能的话你板子上有没有led什么的,有的话你在接受完后 判断一下receive_number是否为你想要的数据,是的话让灯亮一下就行,你想看程序进行到哪儿也可以让灯亮一下就行
------解决方案--------------------
程序没什么问题,你可以单步调试一下,把断点设在接受数据的地方,看看每次接受的数据对不对。