请教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();
}
}
下面这两个函数,为什么不一样呢?
/********************* UART1发送一个字节函数************************/
voidUART1_Send(u8 txd1)
{
SBUF = txd1; //发一个字节
while (!TI);
TI=0;
}
/********************* UART3发送一个字节函数************************/
voidUART3_Send(u8 txd3)
{
S3BUF = txd3; //发一个字节
} 矩阵时间 发表于 2019-8-13 12:20
下面这两个函数,为什么不一样呢?
/********************* UART1发送一个字节函数********************** ...
就发一个字节的,串口3不判那个TI标记我试了也可以正常发送 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);
}
} newywx 发表于 2019-8-13 13:59
就发一个字节的,串口3不判那个TI标记我试了也可以正常发送
另外,清零标识位,这种基本操作你都不写上,何必呢?
这哪需要你去测试它?毫无意义。
赶紧加上两个语句,继续测试,反馈结果才是你需要做的,而不是来这么一句“我试了也可以正常发送”。
几分钟的事情,还真要靠冥想去解决啊? 参照了官方的搞定了{:shutup:}
页:
[1]