写一个基于Keil5开发环境的stm32F103RCT6单片机串口不定长接收数据的C语言程序
时间: 2024-06-03 20:11:56 浏览: 21
好的,这是一个技术问题,我可以帮您解答。以下是一个基于Keil5开发环境的stm32F103RCT6单片机串口不定长接收数据的C语言程序示例:
#include "stm32f10x.h"
#include <string.h>
#define USART_RX_BUF_SIZE 256
volatile unsigned char USART_RX_BUF[USART_RX_BUF_SIZE];
volatile unsigned int USART_RX_STA = 0;
void USART1_IRQHandler(void)
{
u8 Res;
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
Res = USART_ReceiveData(USART1);
if ((USART_RX_STA & 0x8000) == 0)
{
if (USART_RX_STA & 0x4000)
{
if (Res != 0x0a)
USART_RX_STA = 0;
else
USART_RX_STA |= 0x8000;
}
else
{
if (Res == 0x0d)
USART_RX_STA |= 0x4000;
else
{
USART_RX_BUF[USART_RX_STA & 0x3fff] = Res;
if (++USART_RX_STA >= USART_RX_BUF_SIZE)
USART_RX_STA = 0;
}
}
}
}
}
int main(void)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
while (1)
{
if ((USART_RX_STA & 0x8000) == 0x8000)
{
int len = USART_RX_STA & 0x3fff;
USART_RX_BUF[len] = '\0';
printf("Received data: %s\r\n", USART_RX_BUF);
USART_RX_STA = 0;
memset(USART_RX_BUF, 0, USART_RX_BUF_SIZE);
}
}
}
在此示例中,我们首先定义了一个用于存储接收数据的缓冲区 USART_RX_BUF 和一个状态变量 USART_RX_STA,以便在处理接收数据时进行状态管理和控制。然后我们初始化串口1和中断,并在主函数中不断检测 USART_RX_STA 是否已经满足接收完成的条件(即 USART_RX_STA 的最高位是否为 1),如果满足则将接收到的数据打印出来,并清空缓冲区和状态变量以便继续接收下一批数据。
注意:本程序仅供参考,请根据自己的需要进行修改和完善。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)