您的位置:首页 > 其它

STM32串口中断接收和中断发送

2016-03-12 15:12 477 查看
STM32串口USART1中断接收和中断发送

先贴出中断函数:

void USART1_IRQHandler(void){
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
USART1_Buffer[i++]=USART_ReceiveData(USART1);  //USART1_Buffesh是一个自己定义的接收数组
if(i>3){
SendFlag = 1;
}
}
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET){    //USART_IT_TC这里也可替换
if(Open_Send_Flag){     //这是一个发送的标志
uart1_sendstring(temp_data);
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);   //USART_IT_TC
Open_Send_Flag = 0;
}
else{
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);   //USART_IT_TC
}
}
}


发送字符串的函数:

void uart1_sendstring(uint8_t* cp)
{
while((*cp)!='\0')
{
Usart1_Send_isr(*cp);
cp++;
}
}


发送单个字符的函数:

void Usart1_Send_isr(uint8_t ch){
USART_SendData(USART1, (uint8_t)ch);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET ); //这里做缓冲区是否发送完判断
}


然后在中断函数外面发送数据的时候,打开发送中断。USART_ITConfig(USART1, USART_IT_TXE, ENABLE);    //USART_IT_TC

之后再贴出两个简单的串口接收和发送的测试小例子:

第一种:中断接收并把接收到的数据直接发送。

void USART1_IRQHandler(void){
unsigned char RxData;
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
RxData=USART_ReceiveData(USART1);
RxData = RxData + 1;
USART_SendData(USART1,RxData);
}
}


优点:简单,适合很少量数据传输。

缺点:无缓存区,并且对数据的正确性没有判断,数据量稍大可能导致数据丢失 。

第二种:中断接收之后判断数据头和数据尾,如果正确就直接发送出去。

9c97

void USART1_IRQHandler(void){

if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
USART1_Buffer[i++]=USART_ReceiveData(USART1);
}
if((USART1_Buffer[0] == 0x01) && (USART1_Buffer[i-1] == 0x02)){
Flag = 1;
}
if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET){  //溢出,不明白?
USART_ClearFlag(USART1,USART_FLAG_ORE);
USART_ReceiveData(USART1);
}
if(Flag){
for(j = 0;j<20;j++){
USART_SendData(USART1,USART1_Buffer[j]);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: