luybpotter 发表于 2018-10-9 19:43:45

串口无法连续接收数据

本帖最后由 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,一旦配合发送的话,就能多次接收,是什么情况?配置错误?
通过调试发现,无法连续进入接收中断。是配置出问题了?

1a2b3c 发表于 2018-10-9 23:54:40

能调试的话直接看寄存器,接收标志有没有?中断标志有没有,中断使能生效没,简单的事情哈。不能调试就用另外的输出把那些寄存器不停的打印出来看
页: [1]
查看完整版本: 串口无法连续接收数据