6811|18

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

51单片机接收PC字符串的问题 [复制链接]

Dear 各位大虾,

目前在设计系统的时候,使用单片机,但是可以接收给单个字符,不可以接收完整的字符串。

求助诸位看下。

先谢过。



系统描述如下:

使用万利的ME-52HP仿真器,使用MedWin编译。

使用SSCOM3.2作为电脑端串口数据的收发软件。

晶振11.0592,波特率9600。

问题描述如下:

目前可以单片机可以通过串口正确收发单个字符。

但是在接收字符串的时候,只能接收字符串的第一个字符,其余的字符都接收不到。

使用的是SSCOM3.2作为电脑端的串口收发送软件。


如下为串口接收字符串的中断程序:

unsinged char InStr[16]={'a','b','c','d','e','f'}

void UartInStr() interrupt 4
{
  unsinged char  *Str;
  unsinged int i;
  i=0;
     while(RI==0);
     RI=0;
     InStr=SBUF;
  while(InStr[i++]!=0x00)
   {
     while(RI==0);
     RI=0;
     InStr=SBUF;           
        }

    }
}



最新回复

等待牛人来答.  详情 回复 发表于 2008-5-1 02:25
点赞 关注

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
给每个字符中间加上一定的延时估计就可以了
 
 

回复

81

帖子

0

TA的资源

禁止访问

板凳
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

4
 
呵呵~~~~十分感谢jennyvenus 答复,期待大家更多的帮助。


但是目前只能收到字符串的第一个字符。不会每个几个就收到一个。



//////////////////////////////////////////////////////////

偶也想着,既然单个字符可以接收,那偶就在发送端把要发送的字符串,分成一个一个的字符来发送,估计就可以了。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 
你的中断程序写法有问题
放在外头可以
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

6
 
你这个写法是有非常大的问题的,首先你可能对接收中断还不是特别理解,在用Uart接收中断的时候,它是每接收一个字节就中断一次,当你发N个字符的字符串时就要中断N次.所以将你程序修改如下,你回去调试一下看行不行?

unsinged char InStr[16]={'a','b','c','d','e','f'}
unsinged char InStrLoc = 0; //存放接收到的数据在InStr中的位置

void UartInStr() interrupt 4
{
     if(RI)
     {
       RI=0;
       InStr[InStrLoc++]=SBUF;
    }
}


接收中断程序这样就可以了,要判断一个字符
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

7
 
楼主的写法自然有误,不过按俺的理解,也应该能够接收。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

8
 
这里太没有人气了,是我们不够活跃,还是搞这行的人太少了呢?
我狂顶!
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

9
 
不要在中断里设置循环,一个中断只能收一个字符,循环也没用。中断第二次调用时,进程内变量也就复位了,还是不能正确处理。
所以不要用循环。
写这两句就够了

      InStr[InStrLoc++]=SBUF;
      RI=0;  
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

10
 
肯定是程序的问题,step by step查找,

btw:这段程序写的很没有道理,真替你汗颜,中断程序这样写,对着它看半小时吧。。。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

11
 
btw:TI中断也要处理,万一来了一个TI,你的程序不就废了,
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

12
 


引用 5 楼 sszzhh 的回复:
你这个写法是有非常大的问题的,首先你可能对接收中断还不是特别理解,在用Uart接收中断的时候,它是每接收一个字节就中断一次,当你发N个字符的字符串时就要中断N次.所以将你程序修改如下,你回去调试一下看行不行?

unsinged char InStr[16]={'a','b','c','d','e','f'}  
unsinged char InStrLoc = 0; //存放接收到的数据在InStr中的位置

void UartInStr() interrupt 4  
{  
     if(RI)
     {
       RI=0; …
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

13
 
算算:你的晶振是11.0592M,一秒钟内执行单周期指令的条数为11.0592/12,大约为1M,你的波特率为9600,即收一位数据的时间大约等于你执行一条指令的时间,你在收到一个字符后执行了那么多指令再收第二个字符,肯定是不行了。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

14
 
搂住的程序有问题:

unsinged char InStr[16]={'a','b','c','d','e','f'}; //全局数组;

void UartInStr() interrupt 4
{
  unsinged char  *Str; //没用
  unsinged int i; //局部变量:这里是只能接收一个字符的主要问题所在
  //因为是局部变量,每次来一个字符就进入中断服务程序,i每次被清0;所以
  //你始终只有InStr[0]中有接收来的字符。
  i=0;
     while(RI==0);
     RI=0;
     InStr=SBUF;
  while(InStr[i++]!=0x00) //由于发一串字符的时候中断非常快,所以i根本就不可能到达InStr[i++]==0x00
   //所以可能一次在这里形成中断嵌套,所以你的程序应该还有跑飞的情况。

   {
     while(RI==0);
     RI=0;
     InStr=SBUF;   
}

    }
}

完全可以参考5楼:
#define MAXLEN 100   //根据实际情况设置
unsinged char InStr[16]={'a','b','c','d','e','f'} ;
unsinged char InStrLoc = 0; //存放接收到的数据在InStr中的位置

void UartInStr() interrupt 4
{
     if(RI && InStrLoc < MAXLEN)
     {
       RI=0;
       InStr[InStrLoc++]=SBUF;
    }
}


接收中断程序这样就可以了,要判断一个字符
 
 
 

回复

99

帖子

0

TA的资源

一粒金砂(初级)

15
 
serial () interrupt 4
{
        if (RI)
        {
                RI = 0;
                if(!bufful)
                {
                        InStr++= SBUF;            //放入数据           
                       
                }
        }
}
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

16
 
serial () interrupt 4
{
if (RI)
{
RI = 0;
if(!bufful)
{
Str++= SBUF;            //放入数据           
if( Str = InStr+ MAXSIZE )
bufful = 1;
}
}
}
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

17
 
这一版块,太没人气了,是不是大家都成大侠了

如果成大侠了,也常回家看看嘛,家里太冷清了

据说努力顶帖也是一种美德,但我只想大家常回家看看

毕竟每天都有新手需要帮忙,而我能帮的只能是把帖子顶起来
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

18
 
没遇到过这种情况.
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

19
 
等待牛人来答.
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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