串口无法连续接收数据

2020-02-10 09:00发布

本帖最后由 luybpotter 于 2018-10-9 20:08 编辑
  1. void init_Ser() {
  2.     TXSEL = 0;
  3.     RXSEL = 0; //TX:RB6引脚 RX:RB7引脚
  4.     SYNC = 0; //选择异步通信模式
  5.     BRGH = 0; //选择高速波特率发生模式
  6.     BRG16=0;
  7.     SPEN = 1; //串行通信端口打开
  8.     TXEN = 1; //允许发送数据
  9.     SPBRGL = 51; //设置波特率为9600,32M, 低速模式 //51为9600波特率 12为38400波特率
  10.     TX9=0;RX9=0;//发送和接收都是8位数据模式
  11.     CREN=1;                //开启异步通信的接收功能
  12.     SCKP=0;     //未反相的数据 发送
  13. }
  14. /***********************************************************************
  15.         函数原型:void interrupt usart(void)
  16.         功    能:首先检测发送来的数据是不是数据接收的起始数据(0x00),如果
  17.                           接收到起始位,开始将数据保存到数组中,数据接收的停止数据(
  18.                           0xff),为了有效数据(0xff)的传输,定义至少传输5个字节的数据
  19. *************************************************************************/
  20. void interrupt usart(void)
  21. {
  22.         if(RCIF)                                                                 //判断是否为串口接收中断
  23.         {
  24.                 uchar        recdata;
  25.                 recdata = RCREG;
  26.                 RCIE=0;                                                                //未接收完之前关闭接收中断,停止接收,防止冲突
  27.                 if(start)                                                        //如果数据收到数据接收起始位,开始接收数据,存进数组
  28.                 {
  29.                         num++;                                                        //接收的数据加1       
  30.                         if((recdata==end_dat)&&(num>=5))//如果接收的数据是数据接收标志,停止接收num>=5是由于保证
  31.                                                                                         //数据最少是3位有效的数据
  32.                         {
  33.                                 uartdata[num-1] = recdata;        //将最后接收到的数据接收结束数据edd_dat存到数组
  34.                                 start = 0;                                        //数据接收停止
  35.                                 rec_flag = 1;                                //数据接收完毕标志位
  36.                                 datanum=num;
  37.                                 num = 0;                                        //将数据接收个数清零,为了下次数据接收       
  38.                                 goto uart_end;                                //数据接收结束,重新开放接收中断
  39.                         }
  40.                         if(num<10)                                                //只要数据在接收有效范围内,在此定义最多一次传送10个数据,可更改
  41.                         {       
  42.                                 uartdata[num-1] = recdata;        //将接收的数据存放到数组中
  43.                         }
  44.                 }
  45.                 else
  46.                 {
  47.                         if(recdata == start_dat)                //如果接收的数据是接收起始数据
  48.                         {        K1 = ~ K1;                                                       
  49.                                 start = 1;                                        //开启数据接收标志start
  50.                                 num = 1;                                        //计算接收数据的个数
  51.                                 uartdata[0] = recdata;                //将起始数据存放到数组中
  52.                         }
  53.                 }
  54.              if(OERR)//OERR为1表示有溢出错误位,将CREN清零可以将其清零
  55.      {
  56.                  
  57.       CREN=0;
  58.       CREN=1;
  59.      }
  60.         uart_end:
  61.                 RCIE = 1;                                                        //数据接收完毕,再次开放接收中断
  62.         //}

  63.         }
复制代码
接收中断如上,首次字符串能接收,第二次无论发什么字符串或者字符,都不进入中断
but,一旦配合发送的话,就能多次接收,是什么情况?配置错误?
通过调试发现,无法连续进入接收中断。是配置出问题了?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
1a2b3c
1楼-- · 2020-02-10 09:36
能调试的话直接看寄存器,接收标志有没有?中断标志有没有,中断使能生效没,简单的事情哈。不能调试就用另外的输出把那些寄存器不停的打印出来看

一周热门 更多>