如果采用查詢接收方式接受串口數(shù)據(jù),就會造成接收不及時,還沒接收完數(shù)據(jù),下一個數(shù)據(jù)就發(fā)過來了,就會把上一個數(shù)據(jù)覆蓋了,造成數(shù)據(jù)丟失。所以可以通過中斷去接收數(shù)據(jù),開啟接收中斷。而發(fā)送數(shù)據(jù),是我們自己決定的,只要調用函數(shù)就可以了,不需要開啟中斷。
要串口接收數(shù)據(jù),需要在昨天串口發(fā)送數(shù)據(jù)的基礎上,再設置中斷接收函數(shù)。接收數(shù)據(jù)的中斷時間有準備好讀取接收到的數(shù)據(jù)、檢測到空閑線路,事件標志分別為RXNE、IDLE。對應狀態(tài)寄存器(USART_SR)的位5和位4。相應的使能控制位RXNEIE、IDLEIE在控制寄存器 1 (USART_CR1)的位5和位4。


根據(jù)寄存器配置中斷
//設置中斷
USART1- >SR = 0; //清中斷標志
//外設中斷
USART1- >CR1 |= 1< 5; //開接收中斷
USART1- >CR1 |= 1< 4; //開空閑中斷
//nvic
prigroup = NVIC_GetPriorityGrouping(); //得到優(yōu)先級分組
priority = NVIC_EncodePriority(prigroup,1,2); //優(yōu)先級編碼
NVIC_SetPriority(USART1_IRQn,priority); //設置中斷優(yōu)先級
// //
// NVIC- >ISER[EXTI2_IRQn/32] = 1< (EXTI2_IRQn%32);
NVIC_EnableIRQ(USART1_IRQn); //使能USART1中斷

接著就是中斷函數(shù)來接收并處理得到的數(shù)據(jù)。需要標志判斷是否進入接收中斷,還要設置一個一定長度的數(shù)組保存數(shù)據(jù)寄存器的數(shù)據(jù)。
中斷函數(shù)
u8 Usart1_buf[USART1_BUF_SIZE] = {0}; //定義數(shù)組保存數(shù)據(jù)
u8 Usart1_OK = 0; //接收數(shù)據(jù)標志位
void USART1_IRQHandler()
{
static u16 cnt = 0;
if((USART1- >SR & (1< 5)) != 0) //接收中斷
{
Usart1_buf[cnt] = USART1- >DR; //把數(shù)據(jù)寄存器的值保存到數(shù)組中
cnt++;
if(cnt == USART1_BUF_SIZE - 1) //判斷數(shù)組是否裝滿
{
Usart1_buf[cnt] = '?';
Usart1_OK = 1; //接收數(shù)據(jù)標志
cnt = 0;
}
}
else if((USART1- >SR & (1< 4)) != 0) //空閑中斷
{
Usart1_buf[cnt] = '?';
Usart1_OK = 1; //接收數(shù)據(jù)標志
cnt = 0;
}
else
USART1- >SR = 0;
}
主函數(shù)
#include "stm32f4xx.h"
#include "usart.h"
#include "stdio.h"
#include "string.h"
int main()
{
Usart1_Init(9600);
while(1)
{
if(Usart1_OK == 1)
{
Usart1_OK = 0;
if(strcmp((const char *)Usart1_buf,"Hello!") == 0)//判斷接收到的數(shù)據(jù)
Usart1_SendStr("Hi!rn");
else
Usart1_SendStr("What do you say?rn");
}
}
}
在昨天發(fā)送程序的基礎上,再加上以上程序,就可以進行中斷接收數(shù)據(jù)了。其中string.h頭文件中,有很多函數(shù)可以處理字符串,可以用來方便地處理串口接收的數(shù)據(jù)。


最后編譯完燒入程序,從串口發(fā)送數(shù)據(jù)到STM32,達到預期效果,串口中斷接收就成功了。
-
處理器
+關注
關注
68文章
20255瀏覽量
252413 -
STM32
+關注
關注
2310文章
11162瀏覽量
373513 -
數(shù)據(jù)寄存器
+關注
關注
0文章
33瀏覽量
8242 -
串口中斷
+關注
關注
0文章
67瀏覽量
14614 -
狀態(tài)寄存器
+關注
關注
0文章
39瀏覽量
7403
發(fā)布評論請先 登錄
STM32串口發(fā)送數(shù)據(jù)和接收數(shù)據(jù)方式
STM32串口發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的方式有哪些?
STM32串口是如何去實現(xiàn)數(shù)據(jù)發(fā)送與接收的
STM32串口發(fā)送數(shù)據(jù)與接收數(shù)據(jù)淺析
labview串口接收數(shù)據(jù)_labview串口被動接收數(shù)據(jù)
STM32串口通信數(shù)據(jù)亂碼的相關問題
STM32串口接收不定長數(shù)據(jù)的程序免費下載
stm32 串口接收不定長度數(shù)據(jù)及黏包處理 + 串口DMA接收
stm32串口DMA數(shù)據(jù)接收不完整問題說明
關于STM32串口3的使用,接收并解析一幀數(shù)據(jù)
STM32串口數(shù)據(jù)接收 --環(huán)形緩沖區(qū)
串口如何接收數(shù)據(jù) STM32串口接收數(shù)據(jù)
評論