amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 173|回复: 5

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

[复制链接]
发表于 2019-8-13 10:06:22 | 显示全部楼层 |阅读模式
之前在论坛看到有个兄弟发了一个超声波的帖子,后来买了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接收处理哪里有问题


接51串口1--.png 接51串口3--.png

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

u8        xdata        RX1_Buffer[20];        //接收缓冲
u8        xdata        RX3_Buffer[20];        //接收缓冲
u8        xdata        Dispbuf[4];        //接收显示数据缓冲区,依次保存列,行位置和字符
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();
void  UART1_Init();
void  UART3_Init();
void         UART1_Proc();
void         UART3_Proc();
void  UART1_Send(u8 txd1);
void  UART3_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参数初始化************************/
void  UART1_Init()
{
        T2H = 0xFD;                                //定时器T2 波特率9600@22.1184MHz,1T
        T2L = 0xC0;
        AUXR = 0x15;
        SCON = 0x50;
        ES = 1;                                                //开串口1中断
//        EA = 1;                                                //开总中断
}


/********************* UART3参数初始化************************/
void  UART3_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[CT3]=RT3;        //数据存入缓冲区
        CT3++;                  //指针加1指向一下存储单元
        if(CT3>=2)         //判断指针是否超范围
                {
                CT3=0;        //到达缓冲区未,清指针
                HighLen = RX3_Buffer[0];
                LowLen = RX3_Buffer[1];
                UART1_Send(HighLen);
                UART1_Send(LowLen);
                UART3_Send(HighLen);
                UART3_Send(LowLen);
                }
}

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

/********************* UART3发送一个字节函数************************/
void  UART3_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发送一个字节函数************************/
void  UART1_Send(u8 txd1)
{
        SBUF = txd1;                //发一个字节
        while (!TI);
        TI=0;        
}

/********************* UART3发送一个字节函数************************/
void  UART3_Send(u8 txd3)
{
        S3BUF = txd3;                //发一个字节
}
 楼主| 发表于 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[CT3]=RT3;        //数据存入缓冲区
        CT3++;                  //指针加1指向一下存储单元
        if(CT3>=2)         //判断指针是否超范围
                {
                CT3=0;        //到达缓冲区未,清指针
                HighLen = RX3_Buffer[0];
                LowLen = RX3_Buffer[1];
                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标记我试了也可以正常发送

另外,清零标识位,这种基本操作你都不写上,何必呢?
这哪需要你去测试它?毫无意义。
赶紧加上两个语句,继续测试,反馈结果才是你需要做的,而不是来这么一句“我试了也可以正常发送”。
几分钟的事情,还真要靠冥想去解决啊?
 楼主| 发表于 2019-8-15 13:53:29 | 显示全部楼层
参照了官方的搞定了
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-9-15 18:48

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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