51单片机串口接收错误,发一串固定字符串,接受的也是固定的,只是接受错误,怎么办?

用伟福仿真器,晶振12MHz,波特率2400bps。voidserial_Init(void)//模式1,8位自动重装,2400bps,12MHz{SCON=0x50;/... 用伟福仿真器,晶振12MHz,波特率2400bps。
void serial_Init(void) //模式1,8位自动重装,2400bps,12MHz
{
SCON=0x50;//串口工作方式为1,SCON允许串口接收位REN置1
TMOD=0x20;//工作方式控制寄存器TMOD,控制定时器1工作在模式2,8位自动重装
TH1=0xF3; //定时计数器1高8位
TL1=0xF3; //定时计数器1低8位,设置T1的溢出率
TR1=1;//定时控制寄存器TCON中的运行控制位,置1表示计数器1启动工作
ES=1;//打开串口中断
EA=1;//允许中断
RI=0;
TI=0;
}
uchar data Send_string=0;//接收数据完成标志,1表示完成
uchar data len=0;
uchar data N;
uchar data b;
sbit Pin=P0^6;//管脚P0^6用作通讯显示
com_interrupt(void) interrupt 4 //串口中断子程序
{
Pin=0;//通讯指示灯亮
if(RI)
{
RI = 0;
b=SBUF;
if((b==0xBB)&&(len==0))//接收开始符为0xBB的数据
{
temp[0]=b;//将开始符赋给temp[0]
}
else//继续接收开始符0xBB后的数据
{
len++;
temp[len]=b;
if(len>6)
{
if((b==0xDD)&&(len>=temp[6]+8))//收到结束符且数据长度为 //(temp[6]+8)时,结束接收
{
N=len;//传递数据长度,数据长度为(N+1)
len=0;//置0,便于下一次接收
Send_string=1;//接收完成标志
}
}
}
}
Pin=1;//通讯指示灯灭
}
当以16进制发送:BB 00 00 00 01 21 05 01 00 77 55 00 01 AF DD时,接收刚开始始终是22 FF FF FD BD F5 FD FF 11 55 FF FD A1 11 07,后来变成22 FF FF FD BD F5 FD FF 11 55 FF FD A1 11 。本人初学51C语言,请教高手真是为什么呢
谢谢大家的热心帮忙,问题解决了
展开
 我来答
tony_sgt
2010-09-17 · TA获得超过8423个赞
知道大有可为答主
回答量:5330
采纳率:66%
帮助的人:1217万
展开全部
12M可以达到这个波特率...
查一下硬件跟软件的搭配..有必要的话降速测试
或是把接收资料取反...
hychyc_2008
2010-09-16 · TA获得超过9741个赞
知道大有可为答主
回答量:1099
采纳率:100%
帮助的人:688万
展开全部
楼主:12M的晶振 是不行的!!要11.0592MHZ啊!

你最好看看串口通讯里波特率跟晶振之间的关系。我回答你这个错误第三次了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
欢愉且聪颖丶雏菊
2010-09-16 · 超过10用户采纳过TA的回答
知道答主
回答量:48
采纳率:0%
帮助的人:0
展开全部
检查一下波特率
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式