我这个程序是51单片机的程序 我用串口调试精灵发送一个16进制的数给单片机,然单片机显示流水灯,然后把接收到的数发送给串口调试精灵。经过我调试,单片机接受的数是对的,但是发送回去就出错了,当我发送0x00给单片机单片机发回给电脑的是0x80,当我发送0x80以上的数单片机发送给电脑的数就对了。这是为什么啊
- #include
- #define UCHAR unsigned int
- UCHAR x,flag;
- void main()
- {
- flag=0;
- TMOD=0x20;
- TH1=0XFD;
- TL1=0XFD;
- TR1=1;
- REN=1;
- SM0=0;
- SM1=1;
- EA=1;
- ES=1;
- while(1)
- {
- if(flag)
- {
- ES=0;
- flag=0;
- SBUF=x;
- while(!TI);
- TI=0;
- ES=1;
- }
- }
- }
- void ser() interrupt 4
- {
- RI=0;
- P1=SBUF;
- x=SBUF;
- flag=1;
- }
问题有点怪啊。楼主可以这样测试一下。既然mcu接收时对的。那么要排除错误是不是真的与接收无关。让单片机初始化后,一直发送给PC某个数据,看看PC接收到什么?
00变成80,硬件问题应该不大的了。貌似是波特率设置问题造成的,重新计算下初值。你的串口调试软件权威不,或许换个串口调试软件试试。
谢谢你的帮助,我换成了一个固定的数还是不行,还是出现同样的问题。我可以加你QQ吗,我QQ 346558320
哦,你好,我的QQ是645776221。
PC接收你的数据。00,变成了80。也就是最后发送的1 bit,接收错误,而且接收到的bit7(最后一位)恒为1。所以,当你发送80以上的数据是,就对了。
锁定两个原因:
1,起始位,停止位,,发送的数据长度不匹配。是否有停止位,数据长度是7还是8?首先你要知道51单片机UART的这几个参数,然后对应看看你的串口调试软件的设置是否和它一直,假如这个软件没有这几个参数的设置,你换一个软件。一般都会有的。
2。波特率设置有误,而且误差不是很大,,开始传输偏差不大,不足以造成收发错误。当传输到最后一位的时候,就开始出现较大的偏差了,所以出现错误。不过假如你mcu接收可以,这个应该问题不大。不过,假如你确定你第一种情况无误。再考虑是否真的是这个造成的。
// ES=0;
flag=0;
SBUF=x;
while(!TI);
TI=0;
// ES=1;
呵呵,我了个自动生成通信代码的软件,讨论在
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4023698&bbs_page_no=1&search_mode=4&search_text=HuWenjin&bbs_id=9999
51的问题,也可以去哪里问。
------------------------------------
你没有理解那些 TI 和 RI 是做什么用的,该如何控制,所以~~
在中断程序中,最少要写一下
if( RI )
RI = 0;
串口中断产生:
1:收到数据 RI=1
2:数据发送完成/要求发送 TI=1
Saimen 说的
你没有理解那些 TI 和 RI 是做什么用的,该如何控制,所以~~
在中断程序中,最少要写一下
if( RI )
RI = 0;
我觉得我的程序没问题啊。当产生中断当然 RI=1 所以在中断中置为0
UPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUP
中断产生可能是发送中断或接收中断
不一定是RI来了,有可能是TI来了
while(1)
{
if(flag)
{
ES=0;
flag=0;
SBUF=x;
while(!TI);
TI=0;
ES=1;
}
}
}
void ser() interrupt 4
{
RI=0;
P1=SBUF;
x=SBUF;
flag=1;
}
改成下面的
while(1)
{
if(flag)
{
ES=0;
flag=0;
SBUF=x;
TI = 0; //<-----
while(!TI);
TI=0;
ES=1;
}
}
}
void ser() interrupt 4
{
if( RI ) <-----
{
RI=0;
P1=SBUF;
x=SBUF;
flag=1;
}
}
我建议你还是去
http://item.taobao.com/auction/item_detail-0db2-4f09e6476eb55c8fe0a317d59cfb3b33.htm
很明显不行,不知道你这是不是51 单片机,你用的是方式1通讯,
你这样改下试试,
while(1)
{
if(flag)
{
ES=0;
flag=0;
SM2=0;//单片机向上位机发送时,可能是少了这个标志。
SBUF=x;
while(!TI);
TI=0;
ES=1;
}
}
大哥们啊。,救救我。我用过了你们说的所有方法了。,都不行啊
http://hi.baidu.com/%D2%DD%BA%AD%BF%C6%BC%BC/blog/item/0c485a12d200dacaa6ef3ff1.html
下个手册下来看看,不行就用我的整套吧
感谢大家回复,问题解决了,由于12M晶振有误差换成11,的就可以了