STM32 HAL 库 利用串口2接收GNRMC数据解析后通过串口3发出
时间: 2023-09-18 12:12:18 浏览: 106
在STM32 HAL库中,可以通过以下步骤实现利用串口2接收GNRMC数据解析后通过串口3发出:
1. 初始化串口2和串口3
在初始化函数中,要对串口2和串口3进行初始化,设置波特率、数据位、停止位、奇偶校验位等参数。具体实现可以参考以下代码:
```c
#include "stm32f4xx_hal.h"
UART_HandleTypeDef huart2;
UART_HandleTypeDef huart3;
void MX_USART2_UART_Init(void)
{
huart2.Instance = USART2;
huart2.Init.BaudRate = 9600;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
}
void MX_USART3_UART_Init(void)
{
huart3.Instance = USART3;
huart3.Init.BaudRate = 9600;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_NONE;
huart3.Init.Mode = UART_MODE_TX;
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart3.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart3) != HAL_OK)
{
Error_Handler();
}
}
```
2. 接收串口2数据并解析
在主函数中,可以通过HAL库提供的串口接收函数`HAL_UART_Receive()`来接收串口2的数据。接收到数据后,可以进行解析,提取出需要的信息并存储到变量中。具体实现可以参考以下代码:
```c
#include "string.h"
#define MAX_LEN 100
char gprmc[MAX_LEN] = "";
float lat = 0.0f;
float lon = 0.0f;
float speed = 0.0f;
float course = 0.0f;
int main(void)
{
HAL_Init();
MX_USART2_UART_Init();
MX_USART3_UART_Init();
while (1)
{
// 接收串口2数据
uint8_t rx_data;
HAL_UART_Receive(&huart2, &rx_data, 1, HAL_MAX_DELAY);
if(rx_data == '$') {
// 判断是否为GNRMC数据
HAL_UART_Receive(&huart2, &rx_data, 1, HAL_MAX_DELAY);
if(rx_data == 'G') {
HAL_UART_Receive(&huart2, &rx_data, 1, HAL_MAX_DELAY);
if(rx_data == 'N') {
HAL_UART_Receive(&huart2, &rx_data, 1, HAL_MAX_DELAY);
if(rx_data == 'R') {
HAL_UART_Receive(&huart2, &rx_data, 1, HAL_MAX_DELAY);
if(rx_data == 'M') {
HAL_UART_Receive(&huart2, &rx_data, 1, HAL_MAX_DELAY);
if(rx_data == 'C') {
HAL_UART_Receive(&huart2, &rx_data, 1, HAL_MAX_DELAY);
if(rx_data == ',') {
// 解析数据
uint8_t i = 0;
while(1) {
HAL_UART_Receive(&huart2, &rx_data, 1, HAL_MAX_DELAY);
if(rx_data == '*') {
gprmc[i] = '\0';
break;
}
gprmc[i] = rx_data;
i++;
}
char *token;
char *delim = ",";
i = 0;
token = strtok(gprmc, delim);
while(token != NULL) {
switch(i) {
case 3:
// 纬度
lat = atof(token + 2) / 60 + atof(token) / 100;
break;
case 4:
// 纬度方向
if(token[0] == 'S') {
lat = -lat;
}
break;
case 5:
// 经度
lon = atof(token + 3) / 60 + atof(token) / 100;
break;
case 6:
// 经度方向
if(token[0] == 'W') {
lon = -lon;
}
break;
case 7:
// 速度
speed = atof(token);
break;
case 8:
// 航向
course = atof(token);
break;
}
token = strtok(NULL, delim);
i++;
}
}
}
}
}
}
}
}
}
}
```
3. 将解析后的数据通过串口3发送出去
在解析完数据后,可以通过HAL库提供的串口发送函数`HAL_UART_Transmit()`将数据发送出去。具体实现可以参考以下代码:
```c
char tx_data[MAX_LEN] = "";
sprintf(tx_data, "Lat: %.6f, Lon: %.6f, Speed: %.2f, Course: %.2f\n", lat, lon, speed, course);
HAL_UART_Transmit(&huart3, (uint8_t*)tx_data, strlen(tx_data), HAL_MAX_DELAY);
```
以上就是利用串口2接收GNRMC数据解析后通过串口3发出的实现方法。在实际应用中,需要根据具体情况进行调整和优化。
阅读全文