串口无法连续接收数据
本帖最后由 luybpotter 于 2018-10-9 20:08 编辑void init_Ser() {
TXSEL = 0;
RXSEL = 0; //TX:RB6引脚 RX:RB7引脚
SYNC = 0; //选择异步通信模式
BRGH = 0; //选择高速波特率发生模式
BRG16=0;
SPEN = 1; //串行通信端口打开
TXEN = 1; //允许发送数据
SPBRGL = 51; //设置波特率为9600,32M, 低速模式 //51为9600波特率 12为38400波特率
TX9=0;RX9=0;//发送和接收都是8位数据模式
CREN=1; //开启异步通信的接收功能
SCKP=0; //未反相的数据 发送
}
/***********************************************************************
函数原型:void interrupt usart(void)
功 能:首先检测发送来的数据是不是数据接收的起始数据(0x00),如果
接收到起始位,开始将数据保存到数组中,数据接收的停止数据(
0xff),为了有效数据(0xff)的传输,定义至少传输5个字节的数据
*************************************************************************/
void interrupt usart(void)
{
if(RCIF) //判断是否为串口接收中断
{
uchar recdata;
recdata = RCREG;
RCIE=0; //未接收完之前关闭接收中断,停止接收,防止冲突
if(start) //如果数据收到数据接收起始位,开始接收数据,存进数组
{
num++; //接收的数据加1
if((recdata==end_dat)&&(num>=5))//如果接收的数据是数据接收标志,停止接收num>=5是由于保证
//数据最少是3位有效的数据
{
uartdata = recdata; //将最后接收到的数据接收结束数据edd_dat存到数组
start = 0; //数据接收停止
rec_flag = 1; //数据接收完毕标志位
datanum=num;
num = 0; //将数据接收个数清零,为了下次数据接收
goto uart_end; //数据接收结束,重新开放接收中断
}
if(num<10) //只要数据在接收有效范围内,在此定义最多一次传送10个数据,可更改
{
uartdata = recdata; //将接收的数据存放到数组中
}
}
else
{
if(recdata == start_dat) //如果接收的数据是接收起始数据
{ K1 = ~ K1;
start = 1; //开启数据接收标志start
num = 1; //计算接收数据的个数
uartdata = recdata; //将起始数据存放到数组中
}
}
if(OERR)//OERR为1表示有溢出错误位,将CREN清零可以将其清零
{
CREN=0;
CREN=1;
}
uart_end:
RCIE = 1; //数据接收完毕,再次开放接收中断
//}
}
接收中断如上,首次字符串能接收,第二次无论发什么字符串或者字符,都不进入中断
but,一旦配合发送的话,就能多次接收,是什么情况?配置错误?
通过调试发现,无法连续进入接收中断。是配置出问题了? 能调试的话直接看寄存器,接收标志有没有?中断标志有没有,中断使能生效没,简单的事情哈。不能调试就用另外的输出把那些寄存器不停的打印出来看
页:
[1]