首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

请问一个单片机串口程序有关问题,

2012-02-06 
请教一个单片机串口程序问题,急啊!!我想通过串口发送字符串到单片机然后在返回,比如发送:0123456789ab程序

请教一个单片机串口程序问题,急啊!!
我想通过串口发送字符串到单片机然后在返回,比如发送: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是否为你想要的数据,是的话让灯亮一下就行,你想看程序进行到哪儿也可以让灯亮一下就行
[解决办法]
程序没什么问题,你可以单步调试一下,把断点设在接受数据的地方,看看每次接受的数据对不对。

热点排行