STM32
直播中

尚文清

7年用户 1592经验值
私信 关注
[问答]

STM32串口接收字符串如何避免溢出和中断紊乱?

STM32串口接收字符串如何避免溢出和中断紊乱?

回帖(1)

陈鲜孰

2021-12-9 10:52:24
//需使能接收非空 和 总线空闲中断

char USART2_IT_string[400];
//全局变量,最终收到的字符串放入,通过判断是否为空来判断是否接收到数据,使用完这个字符串后**务必清零**
char USART2_IT_string_buf[400];
//全局变量,接收字符串的缓存


void USART2_IRQHandler(void){//接收字符串的中断处理函数
        //u8 char_buf;//改为了全局变量
        if(SET == USART_GetITStatus(USART2,USART_IT_RXNE)){
                USART_ClearITPendingBit(USART2,USART_IT_RXNE);
                //清除接收非空中断标志
                char_buf = USART_ReceiveData(USART2);
                //接收这一个字符
                put_char(char_buf,USART2_IT_string_buf);
                //将接收到的字符放入字符串缓存
               
        }
        if(SET == USART_GetITStatus(USART2,USART_IT_IDLE)){
                //USART_ClearITPendingBit(USART2,USART_IT_IDLE);
                //上面的清除操作不会生效,只能通过下2句清除
                USART1->SR;//先读SR
                USART_ReceiveData(USART2);//再读DR
                //通过读SR,DR清除USART_IT_IDLE标志位
                strcpy(USART2_IT_string,USART2_IT_string_buf);
                //将接收完成的字符串缓存放入实际字符串
                mbzero(USART2_IT_string_buf,sizeof(USART2_IT_string_buf));
                //将字符串缓存清零,以便下一次从头开始拼接,避免溢出
        }
}


void put_char(char char_buf, char * char_str){//将字符装入字符串,从第一个''的位置开始
        static int i = 0;
        if(char_str[0] == ''){//如果字符串的第一个字符等于0,让下标i等于0
                i = 0;
        }
        char_str = char_buf;//装入
        i++;//下标后移1
        char_str = '';//让最后一个字符等于0,作为字符串结束标志
}
关键在于理解总线空闲中断,是指总线有一段时间没有电平变化了,说明总线传输1串数据完成,而不是指总线上没有数据
另附发送字符串函数:
void USART2_send_string(char * str){
        char * ***uf = str;
        USART_GetFlagStatus(USART2, USART_FLAG_TC);//循环发送之前读一次TC,这样下面第一次写DR时TC就被清零,清零TC(1个字符发送完成)序列是:读TC、写DR,如果不清除USART_FLAG_TC,第一个数据写入DR后,由于USART外设判断到TC是1,会立刻将第二个数据写入DR,导致第一个数据被覆盖,导致丢失第一个数据
        for(; '' != (****uf); ***uf++){
                USART_SendData(USART2, ****uf);
                while(SET != USART_GetFlagStatus(USART2, USART_FLAG_TC)){
                        ;//等待TC置位,说明发送完成,再次写DR时,将会把TC清零
                }
               
        }
}//send string
举报

更多回帖

×
20
完善资料,
赚取积分