pic单片机用串口发送接收数据
当软件中定义:if(RCIF==1)//接收到数据产生中断{//RCIF=0;//TXIE=1;TXREG=RCREG;//将接收到的数据发送出去单片机接收到一次数据只会...
当软件中定义:
if(RCIF==1) //接收到数据产生中断
{
//RCIF=0;
//TXIE=1;
TXREG=RCREG; //将接收到的数据发送出去
单片机接收到一次数据只会发送一次数据。可是当我把TXREG改为其他的值,如TXREG=0x12;则只要单片机接收到数据,它就会不停的发送数据而不会主动停止,请问是何原因,如何让它主动停止呢。 展开
if(RCIF==1) //接收到数据产生中断
{
//RCIF=0;
//TXIE=1;
TXREG=RCREG; //将接收到的数据发送出去
单片机接收到一次数据只会发送一次数据。可是当我把TXREG改为其他的值,如TXREG=0x12;则只要单片机接收到数据,它就会不停的发送数据而不会主动停止,请问是何原因,如何让它主动停止呢。 展开
3个回答
展开全部
当接收到数据时,RCIF会被置1,如果读了接收结果RCREG,则系统自动会把RCIF清0。
程序把清RCIF语句屏蔽了,但TXREG=RCREG;这一句就是读接收结果(把接收结果RCREG送到发送寄存器TXREG里),所以会自动让RCIF清0,只有新数据来时,RCIF才会置1,才能再进入中断。
如果把发送的语句改为TXREG=0X12(或其他不是RCREG的寄存器的变量),因此中断后没有读取接收数据,也就不能清RCIF,RCIF仍然为1,即中断服务程序退出后,还存在的中断请求,因此就会马上进入中断,从而出现不停的发送数据的现象。
解决的办法有2:
1、让原来屏蔽的语句RCIF=0有效;
2、空读RCREG,如定义一个变量A(unsigned char A),在发送数据后或前,增加A=RCREG就可以了。
程序把清RCIF语句屏蔽了,但TXREG=RCREG;这一句就是读接收结果(把接收结果RCREG送到发送寄存器TXREG里),所以会自动让RCIF清0,只有新数据来时,RCIF才会置1,才能再进入中断。
如果把发送的语句改为TXREG=0X12(或其他不是RCREG的寄存器的变量),因此中断后没有读取接收数据,也就不能清RCIF,RCIF仍然为1,即中断服务程序退出后,还存在的中断请求,因此就会马上进入中断,从而出现不停的发送数据的现象。
解决的办法有2:
1、让原来屏蔽的语句RCIF=0有效;
2、空读RCREG,如定义一个变量A(unsigned char A),在发送数据后或前,增加A=RCREG就可以了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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++;
}
}
}
{
// 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++;
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个问题是这样的,当接收到数据时,RCIF会被置1,如果你读了接收结果RCREG,则系统自动会把RCIF清0。
你这程序把清RCIF语句屏蔽了,但TXREG=RCREG;这一句就是读接收结果(把接收结果RCREG送到发送寄存器TXREG里),所以会自动让RCIF清0,只有新数据来时,RCIF才会置1,才能再进入中断。
如果你把发送的语句改为TXREG=0X12(或其他不是RCREG的寄存器的变量),因此中断后没有读取接收数据,也就不能清RCIF,RCIF仍然为1,即中断服务程序退出后,还存在的中断请求,因此就会马上进入中断,从而出现不停的发送数据的现象。
解决的办法有2:
1、让原来屏蔽的语句RCIF=0有效;
2、空读RCREG,如定义一个变量A(unsigned char A),在发送数据后或前,增加A=RCREG就可以了。
你这程序把清RCIF语句屏蔽了,但TXREG=RCREG;这一句就是读接收结果(把接收结果RCREG送到发送寄存器TXREG里),所以会自动让RCIF清0,只有新数据来时,RCIF才会置1,才能再进入中断。
如果你把发送的语句改为TXREG=0X12(或其他不是RCREG的寄存器的变量),因此中断后没有读取接收数据,也就不能清RCIF,RCIF仍然为1,即中断服务程序退出后,还存在的中断请求,因此就会马上进入中断,从而出现不停的发送数据的现象。
解决的办法有2:
1、让原来屏蔽的语句RCIF=0有效;
2、空读RCREG,如定义一个变量A(unsigned char A),在发送数据后或前,增加A=RCREG就可以了。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询