请选择 进入手机版 | 继续访问电脑版

普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 4082|回复: 3

串口中断通信协议问题

[复制链接]

1

主题

2

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2020-2-27 08:44:30 | 显示全部楼层 |阅读模式
2金钱
我想通过PC端串口工具发送80 06 00 00 00 00给单片机串口,单片机收到这一串指令后,回复一个数值。但是中断程序总有问题,只能运行到:Mark_rec=1;一下是源代码,请大神帮忙解答一下问题,非常感谢!
/*******************************************************************************
*                 
*                                        普中科技
*--------------------------------------------------------------------------------
* 实 验 名                 : RS232串口试验
* 实验说明       : 单片机将串口接收到的数据以10进制显示在数码管上。
* 连接方式       : 见连接图
* 注    意                 :
*******************************************************************************/

#include<reg51.h>

typedef unsigned char  uchar;
typedef unsigned int   uint;
typedef unsigned long  ulong;uchar   rcvdat;

uchar   Mark_rec;
uchar   DATA[7];
uchar   cnt;


void UsartConfiguration();


void UsartConfiguration()
{
        SCON=0X50;                        //设置为工作方式1
        TMOD=0X20;                        //设置计数器工作方式2
        PCON=0X80;                        //波特率加倍
        TH1=0XF3;                    //计数器初始值设置,注意波特率是4800的
        TL1=0XF3;
        TR1=1;                                            //打开计数器
        REN=1;
        EA=1; //开启总中断
        ES=1; //开启串口中断
}

void main(void)
{
        uchar i=0;
        UsartConfiguration();
  while (1)       
        {
          if (Mark_rec==1)
                 {
                          SBUF=DATA[2];
                                while(!TI);
                    TI=0;       
       
                   }
    else if(Mark_rec==2)
                        {
                          SBUF=22;//DATA[cnt];
                                while(!TI);
                    TI=0;       
       
                   }
         else
                  {                       
                     
                            TI=0;
                   }
   }

}
void uart1_isr() interrupt 4 using 2
{
        if (RI)
    {

        RI = 0;                 //清除RI位
                    rcvdat=SBUF;
                    if( (0x80 == rcvdat) && (0x00 == cnt) )       
                                        {
                                                DATA[cnt]=rcvdat;
                                                cnt++;// cnt=1
                                        }
                                else if( (0x06 == rcvdat) && (0x01 == cnt) )
                                        {
                                                DATA[1]=rcvdat;
                                                cnt++;//cnt=2
                                                Mark_rec=1;
                                        }
                                  else if( (cnt<6)&&(1 == Mark_rec)&&(0x00 == rcvdat))
                                        {
                                                //DATA[cnt]=rcvdat;
                                                cnt++;
                                                Mark_rec=2;
                                        }
                                else
                                        {
                                                cnt=0;
                                                Mark_rec=0;
                                        }

                    if(6==cnt)
                                        {
                                                cnt=0;
                                                Mark_rec=3;
                                        }

                        }
                       
    if (TI)
    {
        TI = 0;                 //清除TI位
        //busy = 0;               //清忙标志
    }
}


我知道答案 本帖寻求最佳答案回答被采纳后将获得系统奖励10 金钱 , 目前已有3人回答

回复

使用道具 举报

27

主题

337

帖子

3294

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3294
发表于 2020-2-27 13:38:24 | 显示全部楼层
看下你的开发板晶振是多大的?串口通信最好使用11.0592M的,如果使用12M晶振,通信会有误差
回复

使用道具 举报

1

主题

2

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2020-2-27 16:22:03 | 显示全部楼层
admin 发表于 2020-2-27 13:38
看下你的开发板晶振是多大的?串口通信最好使用11.0592M的,如果使用12M晶振,通信会有误差

应该是程序问题,不判断数据的话,通信是正常的,就是没找出问题,非常感谢你的回复
回复

使用道具 举报

0

主题

49

帖子

242

积分

中级会员

Rank: 3Rank: 3

积分
242
发表于 2020-5-23 20:44:58 | 显示全部楼层
按楼主要求完成程序:/*******************************************************************************
*--------------------------------------------------------------------------------
* 实 验 名       : RS232串口收发多字节
* 实验说明       : 电脑向单片机发送 80 06 00 00 00 00
*                  单片机回复       80 06 00 00 00 00
* 连接方式       :
* 注    意       :
*******************************************************************************/

#include<reg51.h>

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;


u8   receBuf[16]; //uchar   DATA[7];
u8        receCount=0;            //接收到的字节个数

void uart1_isr() interrupt 4 using 2
{
        if (RI)
        {
                RI = 0;                 //清除RI位
                receBuf[receCount]=SBUF;
                receCount++;          //接收地址偏移寄存器加1
                receCount &= 0x0f;    //最多一次只能接收16个字节
        }
}

void UsartConfiguration()
{
        SCON=0X50;                        //设置为工作方式1
        TMOD=0X20;                        //设置计数器工作方式2
        PCON=0X00;                        //波特率加倍
        TH1=0XFd;                    //计数器初始值设置,9600-0xfd@11.0592;
        TL1=0XFd;
        TR1=1;                                            //打开计数器
        REN=1;
        EA=1; //开启总中断
        ES=1; //开启串口中断
}

void main(void)
{
        u8 i=0;
        UsartConfiguration();
  while (1)      
        {
                u8 m;
               
                if(receCount>5)
                {
                        receCount=0;
                        for (m = 0; m < 6; )
                  {
                                SBUF=receBuf[m];
                                while(TI==0){;}TI=0;m++;
                  }
                }
  }

}




回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-3-29 20:19 , Processed in 0.091625 second(s), 32 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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