串口接收空闲中断
相信各位机友刚接触的通信协议就是串口了吧,鄙人也不例外。有一个疑问:如果一个主设备一个从设备用串口进行通信,(主设备发、从设备收)如果双方没有约定特定的字符、规定的接收长度进行判断发送的过程已经结束了的话,请问:怎么进行判断接收已经接收了呢?
话不多说,直接上代码!
文章目录
- 一、头文件
- 二、源文件
- 总结
一、头文件
// 这个时间的设置和(软定时+波特率)有关
// 波特率9600(一帧数据是1个起始位+八个数据位+一个停止位)10*1000/9600=1.42ms
// 软定时设置的是5ms左右进入一次中断,所以定时时长是接收时间的3-5倍较为合适
#define UART_OUT_TIME 1
typedef struct _uart
{// 接收串口数据的数组uint8_t uart_dat[UART_DATA_MAX];// 接收串口数据数组的下标uint8_t uart_index;// 串口接收的标志位uint8_t uart_flag;
} UART_DATA;// 使用到的串口初始化
void uart1_init(void);
// 为检查是否发生串口空闲中断的软定时回调函数(回调函数的使用,在上一个文章中有详细的介绍,可查阅)
void uart_free_function(void);
二、源文件
/****************************************************函数名: uart1_init注 释: 9600+模式0参 数: 返回值:
*****************************************************/
void uart1_init(void)
{ // UART1_RXP36F = 0x06; // UART1_TXP37F = 0x06;// 串口1的配置:8位异步模式(1), +0x10/中断使能, +0x20/多机通信使能位, +0x40/串行接收使能位S1CON = SM11 + IE1 + REN1;// 配置波特率S1RELL = 972;S1RELH = 972 >> 8;// 中断使能EINT4 = 1;// 开启软定时startTimer(&uart_free_break, Rep_Time, 1, uart_free_function);
}
/****************************************************函数名: Uart1_Isr注 释: 中断服务函数参 数: 返回值:
*****************************************************/
void Uart1_Isr() interrupt 7
{// 如果接收到计算机发的数据if (RI1 == (S1CON & RI1)){// 清除标志位S1CON &= ~RI1;// 串口接收的标志位置1uart_data.uart_flag = 1;// 判断接收的长度是否超出最大接收长度if (uart_data.uart_index < UART_DATA_MAX){uart_data.uart_dat[uart_data.uart_index] = S1BUF;uart_data.uart_index++;}// 否者的话,停止接收else{uart_data.uart_index = UART_DATA_MAX;}// 该标志位零0,手动喂狗,否则在软定时的回调函数中,超出一定的界限时(超出接收一个字节所需时间的3-5倍)Rx_count = 0;}
}
/****************************************************函数名: uart_free_function注 释: 串口空闲中断的回调函数参 数: 返回值:
*****************************************************/
void uart_free_function(void)
{// 已经发生了串口接收中断if (uart_data.uart_flag == 1){// 计数Rx_count++;// 串口接收中断没有按时喂狗,则判断发生串口空闲中断if (Rx_count > UART_OUT_TIME){// 已经完成了接收的标志位Rec_flag = 1;// 计数值清零Rx_count = 0;// 串口接收中断标志位清零uart_data.uart_flag = 0;// 串口接收数组下标清零uart_data.uart_index = 0;}}
}
总结
其实本质上,串口空闲中断的实现,就是一个简单喂狗思想的体现,在规定的时间内没有完成喂狗操作,则判断已经接收完毕数据。
作为一个刚毕业的小白,希望能和广大的机友们一起交流、一起进步。正式步入这个行业已经半年有余,在这个半年里,发生了很多的变数,可以说自己的心态也得到了很大的历练。
今日寄语:有实力才是王道!
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
