51串口通信

FU33   2010-5-10 09:41 楼主
我这个程序是51单片机的程序 我用串口调试精灵发送一个16进制的数给单片机,然单片机显示流水灯,然后把接收到的数发送给串口调试精灵。经过我调试,单片机接受的数是对的,但是发送回去就出错了,当我发送0x00给单片机单片机发回给电脑的是0x80,当我发送0x80以上的数单片机发送给电脑的数就对了。这是为什么啊

  1. #include
  2. #define UCHAR unsigned int
  3.   UCHAR x,flag;
  4. void main()
  5. {
  6. flag=0;
  7. TMOD=0x20;
  8. TH1=0XFD;
  9. TL1=0XFD;
  10. TR1=1;
  11. REN=1;
  12. SM0=0;
  13. SM1=1;
  14. EA=1;
  15. ES=1;
  16. while(1)
  17. {
  18. if(flag)
  19.    {
  20.     ES=0;
  21.     flag=0;
  22.     SBUF=x;
  23.     while(!TI);
  24.     TI=0;
  25.     ES=1;
  26.    }
  27. }
  28. }

  29. void ser() interrupt 4
  30. {
  31. RI=0;
  32. P1=SBUF;
  33. x=SBUF;
  34. flag=1;
  35. }


回复评论 (15)

问题有点怪啊。楼主可以这样测试一下。既然mcu接收时对的。那么要排除错误是不是真的与接收无关。让单片机初始化后,一直发送给PC某个数据,看看PC接收到什么?

00变成80,硬件问题应该不大的了。貌似是波特率设置问题造成的,重新计算下初值。你的串口调试软件权威不,或许换个串口调试软件试试。
点赞  2010-5-10 10:28
谢谢你的帮助,我换成了一个固定的数还是不行,还是出现同样的问题。我可以加你QQ吗,我QQ 346558320
点赞  2010-5-10 12:11
哦,你好,我的QQ是645776221。

PC接收你的数据。00,变成了80。也就是最后发送的1 bit,接收错误,而且接收到的bit7(最后一位)恒为1。所以,当你发送80以上的数据是,就对了。

锁定两个原因:

1,起始位,停止位,,发送的数据长度不匹配。是否有停止位,数据长度是7还是8?首先你要知道51单片机UART的这几个参数,然后对应看看你的串口调试软件的设置是否和它一直,假如这个软件没有这几个参数的设置,你换一个软件。一般都会有的。

2。波特率设置有误,而且误差不是很大,,开始传输偏差不大,不足以造成收发错误。当传输到最后一位的时候,就开始出现较大的偏差了,所以出现错误。不过假如你mcu接收可以,这个应该问题不大。不过,假如你确定你第一种情况无误。再考虑是否真的是这个造成的。
点赞  2010-5-10 13:05
// ES=0;
    flag=0;
    SBUF=x;
    while(!TI);
    TI=0;
//   ES=1;  
点赞  2010-5-10 14:52

呵呵,我了个自动生成通信代码的软件,讨论在
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

点赞  2010-5-10 15:02
Saimen  说的
你没有理解那些 TI 和 RI 是做什么用的,该如何控制,所以~~

在中断程序中,最少要写一下

if( RI )
  RI = 0;

我觉得我的程序没问题啊。当产生中断当然 RI=1 所以在中断中置为0
点赞  2010-5-10 18:16
UPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUP
点赞  2010-5-10 19:08
中断产生可能是发送中断或接收中断

不一定是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

点赞  2010-5-10 22:30
多调试几遍
点赞  2010-5-10 22:36
按你说的搞了还是不行
点赞  2010-5-11 11:53
很明显不行,不知道你这是不是51 单片机,你用的是方式1通讯,
你这样改下试试,

while(1)
{
if(flag)
   {
    ES=0;
    flag=0;
    SM2=0;//单片机向上位机发送时,可能是少了这个标志。
    SBUF=x;
    while(!TI);
    TI=0;
    ES=1;
   }
}
点赞  2010-5-11 16:39
飘过......................
点赞  2010-5-11 17:24
大哥们啊。,救救我。我用过了你们说的所有方法了。,都不行啊
点赞  2010-5-11 20:07
http://hi.baidu.com/%D2%DD%BA%AD%BF%C6%BC%BC/blog/item/0c485a12d200dacaa6ef3ff1.html

下个手册下来看看,不行就用我的整套吧
点赞  2010-5-11 23:55
感谢大家回复,问题解决了,由于12M晶振有误差换成11,的就可以了
点赞  2010-5-20 13:26
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复