如果采用查詢接收方式接受串口數(shù)據(jù),就會(huì)造成接收不及時(shí),還沒接收完數(shù)據(jù),下一個(gè)數(shù)據(jù)就發(fā)過來了,就會(huì)把上一個(gè)數(shù)據(jù)覆蓋了,造成數(shù)據(jù)丟失。所以可以通過中斷去接收數(shù)據(jù),開啟接收中斷。而發(fā)送數(shù)據(jù),是我們自己決定的,只要調(diào)用函數(shù)就可以了,不需要開啟中斷。
要串口接收數(shù)據(jù),需要在昨天串口發(fā)送數(shù)據(jù)的基礎(chǔ)上,再設(shè)置中斷接收函數(shù)。接收數(shù)據(jù)的中斷時(shí)間有準(zhǔn)備好讀取接收到的數(shù)據(jù)、檢測(cè)到空閑線路,事件標(biāo)志分別為RXNE、IDLE。對(duì)應(yīng)狀態(tài)寄存器(USART_SR)的位5和位4。相應(yīng)的使能控制位RXNEIE、IDLEIE在控制寄存器 1 (USART_CR1)的位5和位4。
根據(jù)寄存器配置中斷
//設(shè)置中斷
USART1- >SR = 0; //清中斷標(biāo)志
//外設(shè)中斷
USART1- >CR1 |= 1< 5; //開接收中斷
USART1- >CR1 |= 1< 4; //開空閑中斷
//nvic
prigroup = NVIC_GetPriorityGrouping(); //得到優(yōu)先級(jí)分組
priority = NVIC_EncodePriority(prigroup,1,2); //優(yōu)先級(jí)編碼
NVIC_SetPriority(USART1_IRQn,priority); //設(shè)置中斷優(yōu)先級(jí)
// //
// NVIC- >ISER[EXTI2_IRQn/32] = 1< (EXTI2_IRQn%32);
NVIC_EnableIRQ(USART1_IRQn); //使能USART1中斷
接著就是中斷函數(shù)來接收并處理得到的數(shù)據(jù)。需要標(biāo)志判斷是否進(jìn)入接收中斷,還要設(shè)置一個(gè)一定長(zhǎng)度的數(shù)組保存數(shù)據(jù)寄存器的數(shù)據(jù)。
中斷函數(shù)
u8 Usart1_buf[USART1_BUF_SIZE] = {0}; //定義數(shù)組保存數(shù)據(jù)
u8 Usart1_OK = 0; //接收數(shù)據(jù)標(biāo)志位
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ù)標(biāo)志
cnt = 0;
}
}
else if((USART1- >SR & (1< 4)) != 0) //空閑中斷
{
Usart1_buf[cnt] = '?';
Usart1_OK = 1; //接收數(shù)據(jù)標(biāo)志
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ā)送程序的基礎(chǔ)上,再加上以上程序,就可以進(jìn)行中斷接收數(shù)據(jù)了。其中string.h頭文件中,有很多函數(shù)可以處理字符串,可以用來方便地處理串口接收的數(shù)據(jù)。
最后編譯完燒入程序,從串口發(fā)送數(shù)據(jù)到STM32,達(dá)到預(yù)期效果,串口中斷接收就成功了。
-
處理器
+關(guān)注
關(guān)注
68文章
19409瀏覽量
231190 -
STM32
+關(guān)注
關(guān)注
2272文章
10924瀏覽量
357585 -
數(shù)據(jù)寄存器
+關(guān)注
關(guān)注
0文章
33瀏覽量
7795 -
串口中斷
+關(guān)注
關(guān)注
0文章
67瀏覽量
14009 -
狀態(tài)寄存器
+關(guān)注
關(guān)注
0文章
39瀏覽量
7144
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
STM32串口發(fā)送數(shù)據(jù)和接收數(shù)據(jù)方式
STM32串口發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的方式有哪些?
STM32串口是如何去實(shí)現(xiàn)數(shù)據(jù)發(fā)送與接收的
STM32串口發(fā)送數(shù)據(jù)與接收數(shù)據(jù)淺析
labview串口接收數(shù)據(jù)_labview串口被動(dòng)接收數(shù)據(jù)
![labview<b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>數(shù)據(jù)</b>_labview<b class='flag-5'>串口</b>被動(dòng)<b class='flag-5'>接收</b><b class='flag-5'>數(shù)據(jù)</b>](https://file1.elecfans.com//web2/M00/A7/29/wKgZomUMQr-AVZ4jAAAm63WiRs8929.png)
STM32串口通信數(shù)據(jù)亂碼的相關(guān)問題
![<b class='flag-5'>STM32</b><b class='flag-5'>串口</b>通信<b class='flag-5'>數(shù)據(jù)</b>亂碼的相關(guān)問題](https://file.elecfans.com/web1/M00/55/65/o4YBAFssS6mAMiglAADuljw-9HE468.png)
STM32串口接收不定長(zhǎng)數(shù)據(jù)的程序免費(fèi)下載
![<b class='flag-5'>STM32</b><b class='flag-5'>串口</b><b class='flag-5'>接收</b>不定長(zhǎng)<b class='flag-5'>數(shù)據(jù)</b>的程序免費(fèi)下載](https://file.elecfans.com/web1/M00/C5/68/pIYBAF9F-PeAEIbVAAFd9djQ_aA898.png)
stm32 串口接收不定長(zhǎng)度數(shù)據(jù)及黏包處理 + 串口DMA接收
![<b class='flag-5'>stm32</b> <b class='flag-5'>串口</b><b class='flag-5'>接收</b>不定長(zhǎng)度<b class='flag-5'>數(shù)據(jù)</b>及黏包處理 + <b class='flag-5'>串口</b>DMA<b class='flag-5'>接收</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
stm32串口DMA數(shù)據(jù)接收不完整問題說明
![<b class='flag-5'>stm32</b><b class='flag-5'>串口</b>DMA<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>接收</b>不完整問題說明](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
關(guān)于STM32串口3的使用,接收并解析一幀數(shù)據(jù)
![關(guān)于<b class='flag-5'>STM32</b><b class='flag-5'>串口</b>3的使用,<b class='flag-5'>接收</b>并解析一幀<b class='flag-5'>數(shù)據(jù)</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32串口數(shù)據(jù)接收 --環(huán)形緩沖區(qū)
![<b class='flag-5'>STM32</b><b class='flag-5'>串口</b><b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>接收</b> --環(huán)形緩沖區(qū)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32串口中斷接收不定長(zhǎng)報(bào)文介紹
![<b class='flag-5'>STM32</b><b class='flag-5'>串口</b>中斷<b class='flag-5'>接收</b>不定長(zhǎng)報(bào)文介紹](https://file1.elecfans.com/web2/M00/AC/26/wKgZomU51oqAYq6xAAAjVqTvkqY443.jpg)
評(píng)論