找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 637|回复: 3
收起左侧

51单片机串口通讯问题,大家看一下,是软件问题,还是晶振问题,小白搞不定了

[复制链接]
ID:999123 发表于 2022-1-9 16:29 | 显示全部楼层 |阅读模式
单片机12MHZ晶振。软件下载到单片机后问题表现为;
         软件设想的表现是;

                         单片机收到上位机发送的任何数据后,先回复:“收到”,再在“收到”后面贴上上位机发送的数据。

      实际表现为,发送:1              回复;收到1             正常

                        发送;11             回复;收到1              不正常,      应该为“收到11”,

                        发送;111           回复:收到1              不正常,     应该为“收到111”,

                       发送;1111          回复;收到1               不正常,     应该“收到1111”,

                       发送;11111          回复;收到1收到               不正常,              应该为,“收到11111”,

把for循环注释掉,也就是让单片机收到什么回复什么,一切表现正常

[16:21:01.014]发→◇1

[16:21:01.045]收←◆收到1
[16:21:05.575]发→◇11

[16:21:05.606]收←◆收到1
[16:21:10.095]发→◇111

[16:21:10.126]收←◆收到1
[16:21:13.415]发→◇1111

[16:21:13.446]收←◆收到1
[16:21:16.631]发→◇11111

[16:21:16.682]收←◆收到1收到
[16:21:19.614]发→◇111111

[16:21:19.666]收←◆收到1收到1
[16:21:27.823]发→◇1111111

[16:21:27.874]收←◆收到1收到1
[16:21:30.942]发→◇11111111

[16:21:30.994]收←◆收到1收到1
[16:21:34.047]发→◇111111111

[16:21:34.118]收←◆收到1收到1收到

[16:21:37.287]发→◇1111111111

[16:21:37.359]收←◆收到1收到1收到
[16:21:41.686]发→◇11111111111

[16:21:41.717]收←◆收到1
[16:21:41.762]收←◆收到1收到
[16:21:44.391]发→◇111111111111

[16:21:44.463]收←◆收到1收到1收到1
回复

使用道具 举报

ID:999123 发表于 2022-1-9 16:29 | 显示全部楼层
  1.         #include<reg52.h>        
  2.         #define uchar unsigned char
  3.         #define uint unsigned int
  4.         unsigned char flag, a, i;
  5.         uchar code table[]="收到";
  6.           void delayms(char i)
  7.           {
  8.                         while(i--);
  9.           }
  10.         void init()
  11.         {
  12.           TMOD=0x20;
  13.           SCON=0x50;
  14.          PCON=0x80;
  15.          
  16.           TH1=0xe6;
  17.           TL1=0xe6;
  18.           TR1=1;
  19.            EA=1;
  20.            ES=1;
  21.          }

  22.          void main()
  23.          {         
  24.                    init();
  25.                   while(1)
  26.            {

  27.          
  28.               if(flag==1)
  29.            {

  30.                      ES=0;
  31.                   for(i=0;i<4;i++)

  32.                  {
  33.                   SBUF=table[i];
  34.                   while(!TI);
  35.                   TI=0;        
  36.                  
  37.                   }



  38.                   SBUF=a;
  39.                   while(!TI);
  40.                   TI=0;
  41.                   ES=1;
  42.                   flag=0;
  43.                  }         
  44.                    }
  45.          
  46.                    }
  47.          
  48.           void ser() interrupt 4

  49.           {
  50.                  RI=0;
  51.                    a=SBUF;
  52.                         

  53.                    flag=1;




  54.           }
复制代码
回复

使用道具 举报

ID:276663 发表于 2022-1-10 09:43 | 显示全部楼层
a只能存一个字节,所以回复a是1,没错啊。
你应该定义
unsigned char rx1buff[32];
unsigned char rx1cnt;
在接收中断里
if(rx1cnt<32)
  rx1buff[rx1cnt++]=SBUFF;
还一个就是,你收到一个字符a,就置位了标志位并关闭了串口接收,所以后面的也不能收到。
目前你的问题是属于没有理解串口数据的存储。
如果改成我这样,你可能发现结果还是一样,因为你收到一个就结束了,发送收到的数据也只是SBUF=a;也只发送了一个数据,而应该像你上面发送收到一样是个循环把收到的数据全发出去。
那就是第二个问题,什么时候知道收完了呢?
1.加个末尾的识别字符
2.用定时器每次收到一个数据重新倒计时,如果倒计时结束了就认为一次数据接收完成,这个时候置位flag.
回复

使用道具 举报

ID:999123 发表于 2022-1-11 11:06 | 显示全部楼层
总之太多奇奇怪怪的问题了,本人先把这个挂起来以后用到的时候再来研究!!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表