newywx 发表于 2019-8-13 10:06:22

请教STC15W4K串口3收发数据问题,发2个字节只能收到1个

之前在论坛看到有个兄弟发了一个超声波的帖子,后来买了2个回来,支持串口直接输出距离的,看着很简单,就是以9600波特率给模块发送0x55后直接返回2个字节的测试距离,把这个模块直接接到STC15W4k56S4的串口3上,外接了一个按键,按下按键后让串口3发送0x55,然后把串口3收到的2个字节再通过串口1和串口3发回来验证对不对,实际试下来收不到模块发出来的2个字节数据,单独用USB转TTL的下载器接到超声波模块上,通过串口助手直接给模块发送0x55能返回正确的2个字节数据的,说明模块是好的,把STC15串口1和串口3接到电脑的串口助手,向STC串口1发送2个字节数据66 BB,串口3只能收到第二个字节BB,向STC串口3发送2个字节数据55 AA,串口3还是只能收到第二个字节AA,不知道我这串口3接收处理哪里有问题




#define MAIN_Fosc                22118400L        //定义主时钟
#include "STC15Fxxxx.H"
#include <intrins.h>   

u8        xdata        RX1_Buffer;        //接收缓冲
u8        xdata        RX3_Buffer;        //接收缓冲
u8        xdata        Dispbuf;        //接收显示数据缓冲区,依次保存列,行位置和字符
u8 xx;
u8 RT1;                       //串口1接收缓冲区RecTemp
u8 CT1;                       //串口1接收字节计数
u8 RT3;                       //串口3接收缓冲区RecTemp
u8 CT3;                       //串口3接收字节计数
u16 TotalDistance;                                                        //测试总的距离
u8 HighLen;
u8 LowLen;

bit R3_flag;                                                //串口3接收数据标志位
bit CloseDoorFlag;                        //开关门标志位

//################################################
// 端口定义
//------------------------------------------------
sbit ExtKey             =P5^4;           //外部按键
sbit RunLED       =P5^3;      //开机运行指示灯端口,0亮,1灭
sbit LED                          =P5^2;      //状态指示灯控制端口,0亮,1灭

/********************** 本地函数声明**************************/
void         Delay1ms(u16 mDelay1);
void         Delay5us();
void         KeyScan();
voidUART1_Init();
voidUART3_Init();
void         UART1_Proc();
void         UART3_Proc();
voidUART1_Send(u8 txd1);
voidUART3_Send(u8 txd3);


/********************** 主程序**************************/
void main()
{
       
        P0M1 = 0x00; P0M0 = 0x00; //P0(双双双双双双双双)
        P1M1 = 0x00; P1M0 = 0x00; //P1(双双双双双双双双)
        P2M1 = 0x00; P2M0 = 0x00; //P2(双双双双双双双双)
        P3M1 = 0x00; P3M0 = 0x00; //P3(双双双双双双双双)
        P4M1 = 0x00; P4M0 = 0x00; //P4(双双双双双双双双)
        P5M1 = 0x00; P5M0 = 0x00; //P5(双双双双双双双双)
        P6M1 = 0x00; P6M0 = 0x00; //P6(双双双双双双双双)
        P7M1 = 0x00; P7M0 = 0x00; //P7(双双双双双双双双)

        Delay1ms(100);
        UART1_Init();
        UART3_Init();
        EA = 1;
       
       
        RunLED = 0;                                //开机运行灯亮
        LED = 1;                     //状态灯灭
        while(1)
                {
                        KeyScan();              //按键扫描
                        UART3_Proc();                        //串口3测距处理
                }
}



/********************** 1ms延时程序**************************/
void Delay1ms(u16 mDelay1)        //1ms延时,22.1184M晶振
{
        unsigned int mDelay2;
        for(;mDelay1>0;mDelay1--)
        {       
                for(mDelay2=0;mDelay2<2000;mDelay2++)
                {;;}
        }
}




/********************** 按键检测**************************/
void KeyScan()
{
        if(ExtKey == 0)          
        {
                Delay1ms(20);       
                if(ExtKey == 0)
                {
                        UART3_Send(0x55);
                }
        }
}

/********************* UART1参数初始化************************/
voidUART1_Init()
{
        T2H = 0xFD;                                //定时器T2 波特率9600@22.1184MHz,1T
        T2L = 0xC0;
        AUXR = 0x15;
        SCON = 0x50;
        ES = 1;                                                //开串口1中断
//        EA = 1;                                                //开总中断
}


/********************* UART3参数初始化************************/
voidUART3_Init()
{
        T3H = 0xFD;                                //定时器T3 波特率9600@22.1184MHz,1T
        T3L = 0xC0;
        T4T3M = 0x0A;
        S3CON = 0x50;
        IE2 = 0x08;                                //开串口3中断
//        EA = 1;                                                //开总中断
}


/********************* UART3处理函数************************/
void UART3_Proc()
{
        if(!R3_flag)return;                  //没有新数据,返回
        R3_flag=0;                                //清零数据标志
        RX3_Buffer=RT3;        //数据存入缓冲区
        CT3++;                  //指针加1指向一下存储单元
        if(CT3>=2)         //判断指针是否超范围
                {
                CT3=0;        //到达缓冲区未,清指针
                HighLen = RX3_Buffer;
                LowLen = RX3_Buffer;
                UART1_Send(HighLen);
                UART1_Send(LowLen);
                UART3_Send(HighLen);
                UART3_Send(LowLen);
                }
}

/********************* UART1发送一个字节函数************************/
voidUART1_Send(u8 txd1)
{
        SBUF = txd1;                //发一个字节
        while (!TI);
        TI=0;       
}

/********************* UART3发送一个字节函数************************/
voidUART3_Send(u8 txd3)
{
        S3BUF = txd3;                //发一个字节
}


/********************* UART1中断函数************************/
void UART1_int (void) interrupt 4
{
        if(RI)
        {
                RI = 0;
                RT3= SBUF;
                R3_flag=1;                           //有数据,建立标志
        }

        if(TI)
        {
                TI = 0;
        }
}


/********************* UART3中断函数************************/
void UART3_int (void) interrupt 17
{
        if(RI3)
        {
                CLR_RI3();                           //清标志
                RT3 = S3BUF;                       //读入缓冲区
                R3_flag=1;                           //有数据,建立标志
        }

        if(TI3)
        {
                CLR_TI3();
        }

}

矩阵时间 发表于 2019-8-13 12:20:09

下面这两个函数,为什么不一样呢?

/********************* UART1发送一个字节函数************************/
voidUART1_Send(u8 txd1)
{
      SBUF = txd1;                //发一个字节
      while (!TI);
      TI=0;      
}

/********************* UART3发送一个字节函数************************/
voidUART3_Send(u8 txd3)
{
      S3BUF = txd3;                //发一个字节
}

newywx 发表于 2019-8-13 13:59:26

矩阵时间 发表于 2019-8-13 12:20
下面这两个函数,为什么不一样呢?

/********************* UART1发送一个字节函数********************** ...

就发一个字节的,串口3不判那个TI标记我试了也可以正常发送

矩阵时间 发表于 2019-8-13 14:42:41

newywx 发表于 2019-8-13 13:59
就发一个字节的,串口3不判那个TI标记我试了也可以正常发送

/********************* UART3处理函数************************/
void UART3_Proc()
{
      if(!R3_flag)return;                  //没有新数据,返回
      R3_flag=0;                              //清零数据标志
      RX3_Buffer=RT3;      //数据存入缓冲区
      CT3++;                  //指针加1指向一下存储单元
      if(CT3>=2)         //判断指针是否超范围
                {
                CT3=0;      //到达缓冲区未,清指针
                HighLen = RX3_Buffer;
                LowLen = RX3_Buffer;
                UART1_Send(HighLen);
                UART1_Send(LowLen);
                UART3_Send(HighLen);
                UART3_Send(LowLen);
                }
}

矩阵时间 发表于 2019-8-13 14:50:35

newywx 发表于 2019-8-13 13:59
就发一个字节的,串口3不判那个TI标记我试了也可以正常发送

另外,清零标识位,这种基本操作你都不写上,何必呢?
这哪需要你去测试它?毫无意义。
赶紧加上两个语句,继续测试,反馈结果才是你需要做的,而不是来这么一句“我试了也可以正常发送”。
几分钟的事情,还真要靠冥想去解决啊?

newywx 发表于 2019-8-15 13:53:29

参照了官方的搞定了{:shutup:}
页: [1]
查看完整版本: 请教STC15W4K串口3收发数据问题,发2个字节只能收到1个