求助:各位大哥怎么会出现这样的问题呢?(串口问题)
[复制链接]
//-------------------------------------头文件--------------------------------------
#include
#include
#include
//-------------------------------------头文件--------------------------------------
//********定义引脚*************************************
sbit P33 = P3^3; //喂狗
sbit P23 = P2^3;
sbit D2 = P0^2;
//********定义引脚*************************************
//**************定义变量*************************************************
int WDogZdJs; //喂狗中断计数
char rece[5]; //接收的字符
int j;
bit receive;
//**************定义变量*************************************************
void delay()
{
int i,j;
for(i=0;i<100;i++)
{
for(j=0;j<10;j++)
{
;
}
}
}
void delay2()
{
int i,j;
for(i=0;i<100;i++)
{
for(j=0;j<500;j++)
{
;
}
}
}
void Sendtex() //向电脑发送字符 '1'
{
SBUF='1';
while(!TI)P33=~P33;
TI=0;
}
void ComInStr() interrupt 4 //串行口中断
{
if(RI) //接收
{
if (j>4)
{
j=0;
}
rece[j]=SBUF;
j++;
if(j>4)
receive=1; //接收标志置位
RI=0;
}
}
void timer0(void) interrupt 1 //喂狗中断程序
{
TH0 = (65536-5000)/256; //重载计数初值 每 5 ms 中断一次
TL0 = (65536-5000)%256; //这是手动装置,如果 T0 为模式 1 的话,必须要手动装入
//如果如果 T0 为模式 2 的话,只要初始化了,
//则在这里可以不要 TH0 = (65536-5000)/256; TL0 = (65536-5000)%256;
WDogZdJs ++;
if ( WDogZdJs >= 10 )
{
P33 =! P33; //不停喂狗
WDogZdJs = 0;
}
}
void main()
{
delay();
P0 = 0xff;
P1 = 0xff;
P2 = 0xff;
P3 = 0xff;
P33 =! P33;
EA = 0;
TMOD=0x21; //定时器1模式1 定时器0模式1
//---------------------------处理串口中断---------------------------------------
SCON=0x50; //串行口工作方式1, 10 位异步收发,波特率由定时器控制
PCON |= 0x00;
TL1=0xFA;
TH1=0xFA; //22.1184M晶振 波特率9600
//---------------------------处理串口中断---------------------------------------
//------------------------------处理中断喂狗------------------------------------
TH0 = (65536-1000)/256; //预置计数初值,每 5 ms 中断一次
TL0 = (65536-1000)%256;
//------------------------------处理中断喂狗------------------------------------
EA = 1 ; //允许中断
ES = 1 ; //允许串行中断
ET0 = 1; //T/C0 开中断(定时器0/计数器0)
ET1 = 0; //T/C0 开中断(定时器0/计数器0)
TR1=1; //启动定时器1/计数器1
TR0 = 1; //启动定时器0/计数器0
while(1)
{
if(receive)
{
Sendtex();
receive = 0;
}
}
}
请教:
void ComInStr() interrupt 4 //串行口中断
{
if(RI) //接收
{
if (j>4)
{
j=0;
}
rece[j]=SBUF;
j++;
if(j>4)
receive=1; //接收标志置位
RI=0;
}
}
说明介绍 5 个字符则 receive 置为 1
现在情况是这样的:
现象1:
当我用串口调试软件 发 '11111' 则 执行了 Sendtex();
是正确的
现象2:
我首先发送字符串 '111' ,没有执行 Sendtex(),
可是然后我发 字符串 '11' ,则执行 Sendtex(),
是两次总共发了 5 个字符啊。
是不是我需要自己写一个东西
表示多久没有接收到 新星,则把
前面的清空,
一般是多久啊?
这样的程序怎么写?
谢谢!