//需使能接收非空 和 总线空闲中断
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