pic单片机用串口发送接收数据

当软件中定义:if(RCIF==1)//接收到数据产生中断{//RCIF=0;//TXIE=1;TXREG=RCREG;//将接收到的数据发送出去单片机接收到一次数据只会... 当软件中定义:
if(RCIF==1) //接收到数据产生中断
{
//RCIF=0;
//TXIE=1;
TXREG=RCREG; //将接收到的数据发送出去
单片机接收到一次数据只会发送一次数据。可是当我把TXREG改为其他的值,如TXREG=0x12;则只要单片机接收到数据,它就会不停的发送数据而不会主动停止,请问是何原因,如何让它主动停止呢。
展开
 我来答
你我悖道各苍凉
高粉答主

2016-02-25 · 繁杂信息太多,你要学会辨别
知道顶级答主
回答量:3.5万
采纳率:98%
帮助的人:3483万
展开全部
  当接收到数据时,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就可以了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
N_0_1
高粉答主

2015-10-30 · 关注我不会让你失望
知道大有可为答主
回答量:8628
采纳率:47%
帮助的人:835万
展开全部
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++;

}

}

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jianghe706
推荐于2018-02-12 · TA获得超过5145个赞
知道大有可为答主
回答量:2213
采纳率:77%
帮助的人:806万
展开全部
这个问题是这样的,当接收到数据时,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就可以了。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式