12416|12

28

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

单片机串口通信接收与发送字符串问题 [复制链接]

 
我的目的是通过电脑给单片机发送一个字符串k+25,单片机接收到该字符串后,发送给电脑25这两个字符;单片机虽然接受到了该字符串,但是发送到电脑时总是+2
这两个字符。我在发送函数里已经用for(j=2;j<4;j++)来限制只发送25这两个字符了,可是现在一直发送+2这两个字符,麻烦各位大神帮我看一下吧,谢谢了
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. unsigned char flag,a,i,j;
  5. uchar table[];
  6. void init()
  7. {
  8.    TMOD=0x20;
  9.    TH1=0xFD;
  10.    TL1=0xFD;
  11.    TR1=1;
  12.    REN=1;
  13.    SM0=0;
  14.    SM1=1;
  15.    EA=1;
  16.    ES=1;
  17.    
  18.   }

  19. void main()
  20. {
  21.    init();
  22.    while(1)
  23.    {

  24.        if(flag==1)
  25.        {   
  26. //          for(i=0;i<4;i++)
  27. //            {
  28. //               table=a;
  29. //              }
  30.                ES=0;
  31. //              SBUF=table[2];
  32. //               SBUF=table[3];
  33.             for(j=2;j<4;j++)
  34.             {
  35.               SBUF=table[j];
  36.                while(!TI);      
  37.               TI=0;
  38.               flag=0;
  39.               ES=1;
  40.               }
  41.              flag=0;
  42.              ES=1;
  43.            }
  44. //           flag=0;
  45. //           ES=1;
  46.            // flag=0;
  47.          
  48. //           ES=1;
  49. //            flag=0;
  50.      
  51.           }
  52. //      SBUF=a;
  53. //      while(!TI);
  54. //      TI=0;
  55. //      ES=1;
  56. //      flag=0;
  57. //     
  58. }
  59. void ser()interrupt 4
  60. {
  61. //    RI=0;
  62. //    a=SBUF;
  63.   for(i=0;i<4;i++)
  64.   {       while(!RI);
  65.       table=SBUF;
  66.     //  while(!RI);
  67.       RI=0;
  68.   }
  69. //     table[0]=SBUF;
  70. //     table[1]=SBUF;
  71. //     table[2]=SBUF;
  72. //     table[3]=SBUF;
  73.      flag=1;
  74.    
  75. }
复制代码


下面是串口助手调试情况:


此帖出自51单片机论坛

最新回复

自己要学会调试啊,现在你发现的情况就是错位了嘛,至于为啥错,你可以从第一个开始显示啊,然后在4个都显示,看是哪里出的问题,总共就这么点代码,能有多少问题,要么是中断收错位,要么是发送的时候错,自己研究  详情 回复 发表于 2017-4-11 08:36
点赞 关注
 

回复
举报

578

帖子

0

TA的资源

纯净的硅(初级)

沙发
 
你这代码应该先把那些注释掉的删除掉再发上来,看着头都晕了,还有中断函数里的这一句table=SBUF;,编译的时候没有报错?
此帖出自51单片机论坛

点评

不小心把table【i】中i给删了  详情 回复 发表于 2017-4-10 08:46
nmg
[mw_shl_code=applescript,true]#include #define uchar unsigned char #define uint unsigned int unsigned char flag,a,i,j; uchar table[]; void init() { TMOD=0x20; TH1=0xFD; TL1=0xFD;  详情 回复 发表于 2017-4-10 07:42
 
个人签名刻苦学习,共同进步
 
 

回复

5217

帖子

236

TA的资源

管理员

板凳
 
迈尔风随 发表于 2017-4-9 23:32
你这代码应该先把那些注释掉的删除掉再发上来,看着头都晕了,还有中断函数里的这一句table=SBUF;,编译的 ...



删减版本,确实看着晕乎的
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. unsigned char flag,a,i,j;
  5. uchar table[];
  6. void init()
  7. {
  8.    TMOD=0x20;
  9.    TH1=0xFD;
  10.    TL1=0xFD;
  11.    TR1=1;
  12.    REN=1;
  13.    SM0=0;
  14.    SM1=1;
  15.    EA=1;
  16.    ES=1;
  17.    
  18.   }

  19. void main()
  20. {
  21.    init();
  22.    while(1)
  23.    {

  24.        if(flag==1)
  25.        {   

  26.             for(j=2;j<4;j++)
  27.             {
  28.               SBUF=table[j];
  29.                while(!TI);      
  30.               TI=0;
  31.               flag=0;
  32.               ES=1;
  33.               }
  34.              flag=0;
  35.              ES=1;
  36.            }
  37.          

  38.           }
  39. }
  40. void ser()interrupt 4
  41. {

  42.   for(i=0;i<4;i++)
  43.   {       while(!RI);
  44.       table=SBUF;
  45.         RI=0;
  46.   }
  47.      flag=1;
  48.    
  49. }
复制代码

此帖出自51单片机论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复

5217

帖子

236

TA的资源

管理员

4
 
楼主,发帖的内容如果含有代码,请嵌入代码的功能,如下图所示。这样大家看起来更清晰,问题得到解决的机率更大。

此帖出自51单片机论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

点评

恩恩 好的 谢谢提醒  详情 回复 发表于 2017-4-10 08:44
 
 
 

回复

28

帖子

0

TA的资源

一粒金砂(中级)

5
 
nmg 发表于 2017-4-10 07:46
楼主,发帖的内容如果含有代码,请嵌入代码的功能,如下图所示。这样大家看起来更清晰,问题得到解决的机率 ...

恩恩 好的 谢谢提醒
此帖出自51单片机论坛
 
 
 

回复

146

帖子

0

TA的资源

一粒金砂(中级)

6
 
本帖最后由 长得帅怪我落 于 2017-4-10 08:50 编辑

你先别想着只显示25,你先看把for哪里,j=0开始输出,看你能不能原封不动的输出k+25来。然后在根据想象判断是哪里的问题,我发现你的中断里面写法不对,  while(!RI);     table 【i】=SBUF;
此帖出自51单片机论坛

点评

不能显示所有的字符,先是显示k,然后再一次发送数据时显示+; 当我把代码改成如下时,他竟然会全部显示,但是和我的目的不一样, 主函数中SBUF=table[2]和SBUF=table[3]这两个语句无论保留哪个,它竟然都会显示,  详情 回复 发表于 2017-4-10 09:10
 
 
 

回复

28

帖子

0

TA的资源

一粒金砂(中级)

7
 
迈尔风随 发表于 2017-4-9 23:32
你这代码应该先把那些注释掉的删除掉再发上来,看着头都晕了,还有中断函数里的这一句table=SBUF;,编译的 ...

不小心把table【i】中i给删了
此帖出自51单片机论坛
 
 
 

回复

28

帖子

0

TA的资源

一粒金砂(中级)

8
 
长得帅怪我落 发表于 2017-4-10 08:46
你先别想着只显示25,你先看把for哪里,j=0开始输出,看你能不能原封不动的输出k+25来。然后在根据想象判断 ...

不能显示所有的字符,先是显示k,然后再一次发送数据时显示+;
当我把代码改成如下时,他竟然会全部显示,但是和我的目的不一样, 主函数中SBUF=table[2]和SBUF=table[3]这两个语句无论保留哪个,它竟然都会显示,如果把这两个语句都删了,就不会显示任何数据了。不明白为什么即使把 主函数中SBUF=table[2]和SBUF=table[3]这两个语句的条件限制的这么狠了,它竟然都会显示。
帮忙分析一下,谢谢了
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. unsigned char flag,a,i,j;
  5. uchar table[];
  6. void init()
  7. {
  8.    TMOD=0x20;
  9.    TH1=0xFD;
  10.    TL1=0xFD;
  11.    TR1=1;
  12.    REN=1;
  13.    SM0=0;
  14.    SM1=1;
  15.    EA=1;
  16.    ES=1;
  17.    
  18.   }

  19. void main()
  20. {
  21.    init();
  22.    while(1)
  23.    {

  24.           if(flag==1)
  25.        {   
  26.                         ES=0;
  27.               SBUF=table[2];
  28.                           SBUF=table[3];
  29.                            while(!TI);          
  30.                   TI=0;
  31.                           flag=0;
  32.                       ES=1;
  33.                           }
  34.                           
  35.                

  36.                   }

  37. }
  38. void ser()interrupt 4
  39. {  
  40.    RI=0;
  41.    table[0]=SBUF;
  42.    table[1]=SBUF;          
  43.    table[2]=SBUF;
  44.    table[3]=SBUF;
  45.    flag=1;

  46.    
  47.   
  48. }
复制代码
此帖出自51单片机论坛
 
 
 

回复

146

帖子

0

TA的资源

一粒金砂(中级)

9
 
前面那个,你的中断里面写法不对,
   while(!RI);
for(i=0;i<4;i++)
  {      
      table【i】=SBUF;
        RI=0;
  }
     flag=1; 改成这样应该是可以的,你试试。 然后第2种,证明啥?证明你table[0]到table[4]里面都是k+25,你信不?不信你把前面发送的改成table[0]试试。肯定全部显示
此帖出自51单片机论坛

点评

一开始我问的那个实现了,但是现在出现了一个bug,如果我把主函数中改成(j=1;j  详情 回复 发表于 2017-4-10 13:56
成功了 谢谢了  详情 回复 发表于 2017-4-10 09:41
哈哈 行 我试试 谢了  详情 回复 发表于 2017-4-10 09:30
 
 
 

回复

28

帖子

0

TA的资源

一粒金砂(中级)

10
 
长得帅怪我落 发表于 2017-4-10 09:28
前面那个,你的中断里面写法不对,
   while(!RI);
for(i=0;i

哈哈  行 我试试
谢了
此帖出自51单片机论坛
 
 
 

回复

28

帖子

0

TA的资源

一粒金砂(中级)

11
 
长得帅怪我落 发表于 2017-4-10 09:28
前面那个,你的中断里面写法不对,
   while(!RI);
for(i=0;i

成功了  谢谢了
此帖出自51单片机论坛
 
 
 

回复

28

帖子

0

TA的资源

一粒金砂(中级)

12
 
长得帅怪我落 发表于 2017-4-10 09:28
前面那个,你的中断里面写法不对,
   while(!RI);
for(i=0;i

一开始我问的那个实现了,但是现在出现了一个bug,如果我把主函数中改成(j=1;j<3;j++)按理说通过串口助手调试后应该显示+2两个字符,而现在并不是,呈现的是后两个字符25.即使我发送1234这两个字符,显示的不是23,而是34这两个字符,为什么呢?
此帖出自51单片机论坛
 
 
 

回复

146

帖子

0

TA的资源

一粒金砂(中级)

13
 
自己要学会调试啊,现在你发现的情况就是错位了嘛,至于为啥错,你可以从第一个开始显示啊,然后在4个都显示,看是哪里出的问题,总共就这么点代码,能有多少问题,要么是中断收错位,要么是发送的时候错,自己研究
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表