本帖最后由 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[num-1] = recdata; //将最后接收到的数据接收结束数据edd_dat存到数组
- start = 0; //数据接收停止
- rec_flag = 1; //数据接收完毕标志位
- datanum=num;
- num = 0; //将数据接收个数清零,为了下次数据接收
- goto uart_end; //数据接收结束,重新开放接收中断
- }
- if(num<10) //只要数据在接收有效范围内,在此定义最多一次传送10个数据,可更改
- {
- uartdata[num-1] = recdata; //将接收的数据存放到数组中
- }
- }
- else
- {
- if(recdata == start_dat) //如果接收的数据是接收起始数据
- { K1 = ~ K1;
- start = 1; //开启数据接收标志start
- num = 1; //计算接收数据的个数
- uartdata[0] = recdata; //将起始数据存放到数组中
- }
- }
- if(OERR)//OERR为1表示有溢出错误位,将CREN清零可以将其清零
- {
-
- CREN=0;
- CREN=1;
- }
- uart_end:
- RCIE = 1; //数据接收完毕,再次开放接收中断
- //}
- }
复制代码
接收中断如上,首次字符串能接收,第二次无论发什么字符串或者字符,都不进入中断
but,一旦配合发送的话,就能多次接收,是什么情况?配置错误?
通过调试发现,无法连续进入接收中断。是配置出问题了?
一周热门 更多>