3870|8

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

从第四个起隔一个丢一个,困扰两天了 [复制链接]

以下程序段的功能是:
    以2400bps从计算机发送任一字节数据,当单片机收到该数据后,
在此数据前加上一序号然后连同此数据一起发送至计算机
出现的问题:
    当发送abcdefgh时,收到的是1a2b3c4e5g
              如果正常应收到:1a2b3c4d5e6f7g
也就是从第四个开始出了问题,丢一个出现一个。
问题到底出在了哪儿?多谢各位。


#include
#define uchar unsigned char
uchar temp,num,flag;
void init()
{
        //设置并启动定时器1的方式2,8位自动重装
        TMOD=0x20;
        TH1=0xf4;
        TL1=0xf4;
        TR1=1;
        //设置串口
        SM0=0;
        SM1=1; //串口工作方式为方式1
        REN=1;//允许串口接收
        EA=1;//开总中断
        ES=1;//开串口中断
        num=0;  //num是每个字母前的编号
        flag=0;
}
void main()
{
        init();
        while(1)
        {
                if(flag==1)
                {
                        ES=0;
                        flag=0;
                        //以下显示编号1~9
                        num++;
                        if(num==10)
                                num=1;
                        SBUF=0x30+num;
                        while(!TI);
                        TI=0;
                        //发送接收到的数据
                        SBUF=temp;
                        while(!TI);
                        TI=0;
                        ES=1;
                }
        }
}
void serial() interrupt 4
{
        RI=0;
        temp=SBUF;
        flag=1;
}


最新回复

#include #define uchar unsigned char uchar temp,num,flag; uchar buf[7]={0}; void init() { //设置并启动定时器1的方式2,8位自动重装 TMOD=0x20; TH1=0xf4; TL1=0xf4; TR1=1; //设置串口 SM0=0; SM1=1; //串口工作方式为方式1 REN=1;//允许串口接收 EA=1;//开总中断 ES=1;//开串口中断 num=0;  //num是每个字母前的编号 flag=0; } void main() { init(); while(1) { if(flag==1) { ES=0; flag=0; for(i=0;i  详情 回复 发表于 2010-1-25 09:24
点赞 关注

回复
举报

80

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
可能是主机发送过快的缘故吧。
因为中断可以抢占主程序,
while(1)
{
if(flag==1)
{


ES=0;
这期间中断都可能进来。

 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
因为主机是连续发送,你的程序却要求以两倍的速度发回数据。
就是说,同样的时间里面,主机向单片机连续发送了8字节,单片机却要发回16字节数据,这可能吗?
 
 
 

回复

45

帖子

0

TA的资源

一粒金砂(初级)

4
 
//中断和主程序同步有问题。你的主程序处理时间大于1个字符(接受加发送),造成丢失。
//可以考虑发送也用中断

 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 1 楼 zyzhang365 的回复:
可能是主机发送过快的缘故吧。
因为中断可以抢占主程序,
while(1)
{
if(flag==1)
{

ES=0;
这期间中断都可能进来。





后面关闭中断期间,可能未接受数据就丢失了。
 
 
 

回复

93

帖子

0

TA的资源

一粒金砂(初级)

6
 
楼主,你这样的设计思想 是不行的
PC给单片机发送7个字符,而你的单片机每次只能处理一个,接收到后,你又发送两个,这样的时间根本就不够,发送完了两个字符,可能就把第二个要接收的字符给错过了,出现数据丢失很正常的,这样单片机是处理不过来的

建议楼主  接收到7个字符之后,把数据放在一个全局变量的数组中,等待接收完了,然后在去处理数值中的数据,发送给PC
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 cfanlwn 的回复:
楼主,你这样的设计思想 是不行的
PC给单片机发送7个字符,而你的单片机每次只能处理一个,接收到后,你又发送两个,这样的时间根本就不够,发送完了两个字符,可能就把第二个要接收的字符给错过了,出现数据丢失很正常的,这样单片机是处理不过来的

建议楼主? 接收到7个字符之后,把数据放在一个全局变量的数组中,等待接收完了,然后在去处理数值中的数据,发送给PC

能不能再个体点儿,把程序给改下,多谢了
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

8
 
扔到中断中处理就可以了

  1. #include
  2. #define uchar unsigned char
  3. uchar temp,num,flag;
  4. void init()
  5. {
  6. //设置并启动定时器1的方式2,8位自动重装
  7. TMOD=0x20;
  8. TH1=0xf4;
  9. TL1=0xf4;
  10. TR1=1;
  11. //设置串口
  12. SM0=0;
  13. SM1=1; //串口工作方式为方式1
  14. REN=1;//允许串口接收
  15. EA=1;//开总中断
  16. ES=1;//开串口中断
  17. num=0;  //num是每个字母前的编号
  18. flag=0;
  19. }
  20. void main()
  21. {
  22. init();
  23. while(1);
  24. }
  25. void serial() interrupt 4
  26. {
  27.         if(RI)
  28.         {
  29.                 RI=0;
  30.                 temp=SBUF;

  31.                 num++;
  32.                 if(num==10)
  33.                 num=1;

  34.                 SBUF=0x30+num;
  35.                 while(!TI);
  36.                 TI=0;
  37.                
  38.                 SBUF=temp;
  39.                 while(!TI);
  40.                 TI=0;
  41.         }
  42. }

复制代码
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

9
 
#include
#define uchar unsigned char
uchar temp,num,flag;
uchar buf[7]={0};


void init()
{
//设置并启动定时器1的方式2,8位自动重装
TMOD=0x20;
TH1=0xf4;
TL1=0xf4;
TR1=1;
//设置串口
SM0=0;
SM1=1; //串口工作方式为方式1
REN=1;//允许串口接收
EA=1;//开总中断
ES=1;//开串口中断
num=0;  //num是每个字母前的编号
flag=0;
}


void main()
{
init();
while(1)
{
if(flag==1)
{
ES=0;
flag=0;
for(i=0;i<7;i++)
{
//发送接序号
SBUF=0x30+(i+1);序号从1开始
while(!TI);
TI=0;
//发送接收到的数据
SBUF=buf;
while(!TI);
TI=0;

ES=1;
}
}
}
void serial() interrupt 4
{
RI=0;
buf[num++]=SBUF;
if(num==7)flag=1;
}
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表