stm32f103串口设置数组接收数据,数组存储每一个十六进制
时间: 2024-05-04 09:18:45 浏览: 151
STM32F103实现串口收发数据功能
5星 · 资源好评率100%
在STM32F103中使用串口接收数据并存储到数组中,可以按照以下步骤进行设置:
1. 初始化串口
首先需要初始化串口模块,设置波特率、数据位、停止位和校验位等参数,以便正确接收数据。可以参考下面的代码进行初始化:
```c
void USART1_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOA clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* Enable USART1 clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
/* Configure USART1 Tx (PA9) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure USART1 Rx (PA10) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure USART1 for 115200 baud, 8 data bits, 1 stop bit, no parity */
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);
/* Enable USART1 */
USART_Cmd(USART1, ENABLE);
}
```
2. 编写中断服务程序
使用中断服务程序来接收串口数据,可以实现异步接收数据的功能。在中断服务程序中,可以将接收到的数据存储到一个数组中。可以参考下面的代码:
```c
uint8_t rx_buffer[100];
uint8_t rx_index = 0;
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
rx_buffer[rx_index++] = USART_ReceiveData(USART1);
if(rx_index >= 100)
{
rx_index = 0;
}
}
}
```
在这个例子中,定义了一个数组rx_buffer,用于存储接收到的数据。同时设置了一个rx_index变量,用于记录接收到的数据在数组中的位置。每当接收到一个数据时,就将其存储到数组中,同时将rx_index加1。如果数组已经存满了数据,就将rx_index重置为0,从头开始存储数据。
3. 解析数据
接收到的数据是以十六进制的形式存储在数组中的,需要进行解析才能得到原始数据。可以使用以下代码将十六进制数据解析为一个整数:
```c
uint8_t hex_to_int(uint8_t hex)
{
if(hex >= '0' && hex <= '9')
{
return hex - '0';
}
else if(hex >= 'A' && hex <= 'F')
{
return hex - 'A' + 10;
}
else if(hex >= 'a' && hex <= 'f')
{
return hex - 'a' + 10;
}
else
{
return 0;
}
}
uint8_t hex_buffer_to_int(uint8_t *buffer, uint8_t length)
{
uint8_t i;
uint8_t result = 0;
for(i = 0; i < length; i++)
{
result = (result << 4) + hex_to_int(buffer[i]);
}
return result;
}
```
在这个例子中,定义了一个hex_to_int函数和一个hex_buffer_to_int函数。hex_to_int函数用于将一个十六进制字符转换为一个整数,hex_buffer_to_int函数用于将一个存储了十六进制数据的数组解析为一个整数。可以根据需求进行修改。
以上就是在STM32F103中使用串口接收数据并存储到数组中的方法。需要注意的是,在使用中断服务程序时,需要在主函数中开启全局中断和相应的中断向量。可以参考下面的代码:
```c
int main(void)
{
/* Enable global interrupts */
__enable_irq();
/* Enable USART1 interrupts */
NVIC_EnableIRQ(USART1_IRQn);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
/* Initialize USART1 */
USART1_Configuration();
while(1)
{
/* Do something */
}
}
```
阅读全文