本帖最后由 fzh123 于 2013-3-20 09:21 编辑
void sci_Init(void) // 串口配置
{
BRGH = 1; // high baud rate
SPBRG =25; // 设置波特率9600
SYNC = 0; // 1=同步接收方式 0=异步接收方式
SPEN = 1; // 串口使能位
CREN = 1; // 1=允许连续接收 0=禁止连续接收
SREN = 0; // 异步方式:此位未用
TXIE = 0; // 关闭发送
RCIE = 1; // 打开接收中断
RCIF = 0;
PEIE = 1;
TX9 = 0; // 1:选择9位接收 0:选择8位接收
RX9 = 0; // 1:选择9位接收 0:选择8位接收
TXEN = 1; // 发送允许
TRISC6=1; // 作为串口使用,RC6必须设置为输入
TRISC7=1; // 作为串口使用,RC7必须设置为输入
}
void interrupt ISR(void) //中断程序
{
if(RCIF && RCIE)
{
RCIF = 0;
ReceiveOneByte();
}
if(T0IE && T0IF)
{
T0IF = 0;
TMR0 = 0X09;
TimeOutMonitor();
ms_500++;
}
}
void ReceiveOneByte(void) //接收一个字节
{
receive_timeout_flag = 0; //接收到数据,超时标志清零
receive_timer = RECEIVE_TIMEOUT; //接收到数据,超时时间赋值
if(ReceiveIndex < MAX_BUF_LENGTH)
{
RecBuf[ReceiveIndex++] = RCREG;
}
else
{
receive_timer = 0;
receive_timeout = 0;
}
}
void TimeOutMonitor(void) //超时监测
{
if(receive_timer > 0) //接收超时检测
{
receive_timer--;
if(receive_timer == 0)
{
receive_timeout = 1;
}
}
else
receive_timeout_flag = 0;
}
void uartcom(void) //串口处理函数
{
if(receive_timeout_flag == 0)
return;
receive_timeout = 0; //一帧数据接收完成,清超时标志。
if((RecBuf[0] == 0X51)&&(RecBuf[1] == 0X52)&&(RecBuf[2] == 0X53) )
{
;
}
ReceiveIndex = 0;
}
串口中断一直发数据,将断点打在串口处理函数里面,只能停留一次;打在中断函数里面,
也是只能进一次,都是在复位重新运行后才能停在断点处。怎么回事呢?
|