yewuyi 发表于 2013-3-28 08:49 
你所有的相关的寄存器都设置正确的话,你进入中断函数后直接向发送缓冲寄存器送待发数据即可。
当数据包长 ...
请教版主,这是我按你的提示做的:
oid UartInit(void)//初始化函数
{
// INTCONbits.GIE = 0; //清零总中断
// PIE1bits.TXIE = 0; //清零发送中断
// PIE1bits.RCIE = 0; //清除接收中断
TXSTAbits.BRGH = 1; //选择高速模式
TXSTAbits.SYNC= 0; //选择异步模式
// RCSTAbits.SPEN = 0; //清除串口使能位
SPBRG = 162; //波特率设定:25M,异步,高速,9600,查表的值
RCSTAbits.SPEN = 1; //使能串口发送
TRISCbits.TRISC7 = 1; //将
TRISCbits.TRISC6 = 0;
TXSTAbits.TXEN = 0; //允许发送使能
RCSTAbits.CREN = 0; //接收使能:暂时不开启串口接收功能
PIE1bits.TXIE = 1; //发送中断使能位:使能发送中断
// PIR1bits.TXIF = 0; //清零发送中断
PIE1bits.RCIE = 0; //接收中断使能位:暂时关闭接收中断
IPR1bits.RCIP = 0; //接收中断优先级:低
IPR1bits.TXIP = 0; //发送中断优先级:低
RCONbits.IPEN = 1; //中断优先级使能位:使能优先级中断
INTCONbits.PEIE = 1; //使能外设中断
INTCONbits.GIEH = 1; //使能总中断
INTCONbits.GIEL = 1; //使能外设中断
}
当我发送SendToPrin(tmp,3);时
void SendToPrin(uchar* sentdata,uchar totalSend)
{
uchar i;
uchar utSendIndex = 0;
sendpoint = sentdata;
sentlen = totalSend; //记录需要发送的长度
TXREG = *sendpoint; //发送第一个字节
TXSTAbits.TXEN = 1; //使能发送中断
}
中断处理:
void low_isr(void)
{
if (PIR1bits.TXIF == 1)
{
if (sentcnt > sentlen) //send all data
{
sentlen= 0;
sentcnt = 0;
sendpoint = 0;
TXSTAbits.TXEN = 0;
PIR1bits.TXIF = 0;
return;
}
else
{
sentcnt++;
TXREG = *sendpoint++;
}
}
}
现在的情况是,我间隔0.5S,发送一次SendToPrin(tmp,3);
但串口接收端显示不断的收到数据
|