你在主函数中先把RCIF标志位清零,你做的应该是SCI串行通信吧,一上电,就表示程序开始执行了,你程序一开始执行就是要进行SCI串行通信,当然一开始就进入中断了,如果你不想这样,你可以连一个按钮,当此按钮按下后就进入中断执行SCI通信
我把你的程序做了些修改,并在PROTEUS中仿真,是正确的,图中的上面是仿真的发送,我输入了“How Are You"并按回车键,单片机收到回车后,先输出"OK !!!"及回车,再把收到的数回送出去。
这里加了宏定义。有些内容请见北航的《PIC16系列单片机C程序设计与PROTEUS仿真》一书。
#include<pich>
__CONFIG(0x3F31);
#define uchar unsigned char
#define uint unsigned int
//宏定义,发送一个数,并等等发送完毕
#define SEND_ONE(A) \
TXREG=A; \
while(!TRMT)
bit FLAG=0; //标志位,如收到回车字符,此位为1
uchar N=0; //接收数据累计
uchar DD[20]; //接收数据存放在此
const uchar DD1[7]="OK !!!"; //虽然只有6个字符,但要用7个单元,最后一个为结束字符,const表示存放在程序存储器中的常数
void init(void);
void interrupt ISR(void);
void main()
{ uchar i;
init();
while(1)
{ if (FLAG)
{ for (i=0;i<6;i++) //先发送“OK !!!”
{ SEND_ONE(DD1[i]);
}
SEND_ONE(0x0D); //发送一个回车
for (i=0;i<N;i++)
{ SEND_ONE(DD[i]);
}
FLAG=N=0; //重新清0,为下次接收做准备
}
};
}
void init()
{
TRISC=0xff; //这里要把高二位设置这输入,但在以下的串口使能后,系统自动将RC6变成通信输出
TXSTA=0x24;
RCSTA=0x90;
SPBRG=25; //9600波特率
GIE=1;
PEIE=1;
RCIE=1; //打开中断
}
void interrupt ISR(void)
{
if(RCIE && RCIF) //不必清RCIF,因为接收数据后RCIF自动清0
{ DD[N]=RCREG;
if (DD[N]==0x0D)
FLAG=1; //如果收到回车,标志位置1
N++;
if (N>=20)
N=0; //如果接收数据数超出,从0存放
}
}
1 是否使用了USB转串口?如果使用了的话,换一台有串口的台式机试试看,如果好了的话,可能是转接线有问题;
2 不打开VB应用程序,只使用串口助手接收数据,如果有通信协议的话,挑一条可以固定应答的报文循环发送接收,看发送/接收字节数的比率,正常的话会是一个定值,没问题的话,证明下位机应用层到上位机链路层是没有问题的;
3 现在只剩下VB软件了,VB我不会,但是我用VC写过类似的东西,我认为可能是你的软件接收不及时导致了串口接收缓冲区满或者报文接收出现偏差,最好设计一个完备的通信协议,每次通信都要有可靠的缓冲处理、校验处理、应答处理和错误重试处理,一次应答结束后及时清除接收缓冲,这样能保证可靠、持续的通信。
我只提供解决问题的思路,不替代你解决问题,希望能有所帮助,呵呵。
unsigned char rev_data = 0;
unsigned char send_data = 0;
void interrupt ISR()
{
if (RCIE & RCIF) //判断是否为串口接收中断
{
rev_data = RCREG; //将接收缓存器中数据读取出来
if(TRMT == 1)
{
TXREG = rev_data;
}
PORTD = ~PORTD;
}
}
单片机最好不要直接寄存器的值赋给寄存器,对串口接收中断必须将缓存器数据读取出来才能清空。另外main函数中while(1)当中要作长延时,不然数据看不到你从串口助手发送后,单片机返回的数据,你尝试一下,不能保证一定可以。
这个问题是这样的,当接收到数据时,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就可以了。
以上就是关于求助关于PIC单片机串口中断的接受和发送问题全部的内容,包括:求助关于PIC单片机串口中断的接受和发送问题、pic单片机串行通信收发字符串的问题!高分求助!、pic单片机与电脑串口通信不正常:工作一段时间后电脑vb串口程序无法接收到数据,但单片机一直正常工作。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)