OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9194|回复: 6

stm32f103的串口2怎么接收gps信息?

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2014-4-3
在线时间
0 小时
发表于 2014-4-3 20:25:40 | 显示全部楼层 |阅读模式
gps用的是ATK-NEO-6M。  3.5的库。  原子大哥的ALIENTEK MINISTM32 扩展实验23 ATK-NEO-6M GPS模块实验(适合Mini板) 不是3.5的库,看不懂,不会改啊。
我想用串口2接收gps的信息,存到一个数组里,然后用sim900a通过串口一发出去。
但是用DMA接收,短信死活发不出去。关了DMA之后,短信能发了,gps收不到了。
dma定义如下:
void DMA_Configuration(void)
{
  DMA_InitTypeDef DMA_InitStructure;
  /* DMA clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//DMA1
  /* DMA1 Channel4 (triggered by USART1 Tx event) Config */
  DMA_DeInit(DMA1_Channel4);  
  DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40013804;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART1_SEND_DATA;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  DMA_InitStructure.DMA_BufferSize = 512;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel4, &DMA_InitStructure);
  DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);
  DMA_ITConfig(DMA1_Channel4, DMA_IT_TE, ENABLE);
  /* Enable USART1 DMA TX request */
  USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
  DMA_Cmd(DMA1_Channel4, DISABLE);
  /* DMA1 Channel5 (triggered by USART2 Tx event) Config */
  DMA_DeInit(DMA1_Channel7);  
  DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40004404;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART2_SEND_DATA;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  DMA_InitStructure.DMA_BufferSize = 512;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel7, &DMA_InitStructure);
  DMA_ITConfig(DMA1_Channel7, DMA_IT_TC, ENABLE);
  DMA_ITConfig(DMA1_Channel7, DMA_IT_TE, ENABLE);
  /* Enable USART1 DMA TX request */
  USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE);
  DMA_Cmd(DMA1_Channel7, DISABLE);
  /* DMA1 Channel5 (triggered by USART1 Rx event) Config */
  DMA_DeInit(DMA1_Channel5);  
  DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40013804;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART1_RECEIVE_DATA;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = 512;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel5, &DMA_InitStructure);
  DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);
  DMA_ITConfig(DMA1_Channel5, DMA_IT_TE, ENABLE);
  
  /* Enable USART1 DMA RX request */
  USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
  DMA_Cmd(DMA1_Channel5, ENABLE);
  /* DMA1 Channel6 (triggered by USART1 Rx event) Config */
  DMA_DeInit(DMA1_Channel6);  
  DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40004404;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART2_RECEIVE_DATA;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = 512;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel6, &DMA_InitStructure);
  DMA_ITConfig(DMA1_Channel6, DMA_IT_TC, ENABLE);
  DMA_ITConfig(DMA1_Channel6, DMA_IT_TE, ENABLE);
  /* Enable USART2 DMA RX request */
  USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE);
  DMA_Cmd(DMA1_Channel6, ENABLE);
}

void DMA1_Channel5_IRQHandler(void)
{
  DMA_ClearITPendingBit(DMA1_IT_TC5);
  DMA_ClearITPendingBit(DMA1_IT_TE5);
  DMA_Cmd(DMA1_Channel5, DISABLE);//关闭DMA,防止处理其间有数据
  DMA1_Channel5->CNDTR = 512;//重装填
  DMA_Cmd(DMA1_Channel5, ENABLE);//处理完,重开DMA
}

void DMA1_Channel6_IRQHandler(void)
{
  DMA_ClearITPendingBit(DMA1_IT_TC6);
  DMA_ClearITPendingBit(DMA1_IT_TE6);
  DMA_Cmd(DMA1_Channel6, DISABLE);//关闭DMA,防止处理其间有数据
  DMA1_Channel6->CNDTR = 512;//重装填
  DMA_Cmd(DMA1_Channel6, ENABLE);//处理完,重开DMA
}

//USART1使用DMA发数据中断服务程序
void DMA1_Channel4_IRQHandler(void)
{
  DMA_ClearITPendingBit(DMA1_IT_TC4);
  DMA_ClearITPendingBit(DMA1_IT_TE4);
  DMA_Cmd(DMA1_Channel4, DISABLE);//关闭DMA
  USART1_TX_Finish=1;//置DMA传输完成
}

//USART2使用DMA发数据中断服务程序
void DMA1_Channel7_IRQHandler(void)
{
  DMA_ClearITPendingBit(DMA1_IT_TC7);
  DMA_ClearITPendingBit(DMA1_IT_TE7);
  DMA_Cmd(DMA1_Channel7, DISABLE);//关闭DMA
  USART2_TX_Finish=1;//置DMA传输完成
}

GPIO:void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  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);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_Init(GPIOA, &GPIO_InitStructure);
}

USART:
void USART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
   USART_InitStructure.USART_BaudRate = 19200;
  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_ITConfig(USART1, USART_IT_IDLE , ENABLE);
  USART_Cmd(USART1, ENABLE);  
  USART_ClearFlag(USART1, USART_FLAG_TC); /* 清发送外城标志,Transmission Complete flag */
USART_InitStructure.USART_BaudRate = 38400;
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(USART2, &USART_InitStructure);
  USART_ITConfig(USART2, USART_IT_IDLE , ENABLE);//开启空闲,帧错,噪声,校验错中断 
USART_Cmd(USART2, ENABLE);
  USART_ClearFlag(USART2, USART_FLAG_TC); /* 清发送外城标志,Transmission Complete flag */
}

void USART1_IRQHandler(void)
{
u16 DATA_LEN;
u16 i;
  if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)//如果为空闲总线中断
    {
DMA_Cmd(DMA1_Channel5, DISABLE);//关闭DMA,防止处理其间有数据
//USART_RX_STA = USART1->SR;//先读SR,然后读DR才能清除
        //USART_RX_STA = USART1->DR;
  DATA_LEN=512-DMA_GetCurrDataCounter(DMA1_Channel5); 
if(DATA_LEN > 0)
        {
while(USART1_TX_Finish==0)//等待数据传输完成才下一次
            {
                ;
            }
//将数据送DMA存储地址
            for(i=0;i<DATA_LEN;i++)
            {
                USART1_SEND_DATA=USART1_RECEIVE_DATA;
            }
            //USART用DMA传输替代查询方式发送,克服被高优先级中断而产生丢帧现象。
            DMA_Cmd(DMA1_Channel4, DISABLE); //改变datasize前先要禁止通道工作
            DMA1_Channel4->CNDTR=DATA_LEN; //DMA1,传输数据量
            USART1_TX_Finish=0;//DMA传输开始标志量
            DMA_Cmd(DMA1_Channel4, ENABLE);
}
//DMA_Cmd(DMA1_Channel5, DISABLE);//关闭DMA,防止处理其间有数据
DMA_ClearFlag(DMA1_FLAG_GL5 | DMA1_FLAG_TC5 | DMA1_FLAG_TE5 | DMA1_FLAG_HT5);//清标志
DMA1_Channel5->CNDTR = 512;//重装填
DMA_Cmd(DMA1_Channel5, ENABLE);//处理完,重开DMA
//读SR后读DR清除Idle
i = USART1->SR;
i = USART1->DR;
}
if(USART_GetITStatus(USART1, USART_IT_PE | USART_IT_FE | USART_IT_NE) != RESET)//出错
{
USART_ClearITPendingBit(USART1, USART_IT_PE | USART_IT_FE | USART_IT_NE);
}
  USART_ClearITPendingBit(USART1, USART_IT_TC);
  USART_ClearITPendingBit(USART1, USART_IT_IDLE);
}

void USART2_IRQHandler(void)
{
u16 DATA_LEN;
u16 i;
  if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET) //如果为空闲总线中断
    {
DMA_Cmd(DMA1_Channel6, DISABLE);//关闭DMA,防止处理其间有数据
//USART_RX_STA = USART1->SR;//先读SR,然后读DR才能清除
        //USART_RX_STA = USART1->DR;
  DATA_LEN=512-DMA_GetCurrDataCounter(DMA1_Channel6); 
if(DATA_LEN > 0)
        {
while(USART2_TX_Finish==0)//等待数据完成才下一次
            {
                ;
            }
//将数据送DMA存储地址
            for(i=0;i<DATA_LEN;i++)
            {
                USART2_SEND_DATA=USART2_RECEIVE_DATA;
            }
            //USART用DMA传输替代查询方式发送,克服被高优先级中断而产生丢帧现象。
            DMA_Cmd(DMA1_Channel7, DISABLE); //改变datasize前先要禁止通道工作
            DMA1_Channel7->CNDTR=DATA_LEN; //DMA1,传输数据量
            USART2_TX_Finish=0;//DMA传输开始标志量
            DMA_Cmd(DMA1_Channel7, ENABLE);
}
//DMA_Cmd(DMA1_Channel5, DISABLE);//关闭DMA,防止处理其间有数据
DMA_ClearFlag(DMA1_FLAG_GL6 | DMA1_FLAG_TC6 | DMA1_FLAG_TE6 | DMA1_FLAG_HT6);//清标志
DMA1_Channel6->CNDTR = 512;//重装填
DMA_Cmd(DMA1_Channel6, ENABLE);//处理完,重开DMA
//读SR后读DR清除Idle
i = USART2->SR;
i = USART2->DR;
}
if(USART_GetITStatus(USART2, USART_IT_PE | USART_IT_FE | USART_IT_NE) != RESET)//出错
{
USART_ClearITPendingBit(USART2, USART_IT_PE | USART_IT_FE | USART_IT_NE);
}
  USART_ClearITPendingBit(USART2, USART_IT_TC);
  USART_ClearITPendingBit(USART2, USART_IT_IDLE);
}



求原子大哥给一个好用的串口1,2的程序。既能收到GPS,又能发送短信。







正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-4-3 23:30:40 | 显示全部楼层
回复【楼主位】lostreaver:
---------------------------------
请看我们的GPS模块例程。
用的就是串口2接收!
论坛搜索:ATK-NEO-6M
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2014-4-3
在线时间
0 小时
 楼主| 发表于 2014-4-4 07:23:04 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
那个好像不是3.5的库吧??请问怎么移植到3.5的呢??
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-4-4 23:22:58 | 显示全部楼层
回复【3楼】lostreaver:
---------------------------------
都是寄存器版本的。。。
暂时没有库函数版本的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-4-4 23:23:18 | 显示全部楼层
移植过去,你只需要去实现底层的接口即可,主要是usart2.c的内容。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2018-8-12
在线时间
5 小时
发表于 2018-9-20 21:33:05 | 显示全部楼层
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f1xx_hal.h"

/* USER CODE BEGIN Includes */
#include "string.h"
#include "stdlib.h"
#include "stdio.h"

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/
UART_HandleTypeDef huart2;


UART_HandleTypeDef huart4;



/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/


uint8_t aRxBuffer[1];



/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);


static void MX_UART4_UART_Init(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */


//全局标志


int pindu_seconds=60;

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  *
  * @retval None
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
       
       
       
       
       
  /* USER CODE END 1 */
       
        char Latitude[100];
        char Latitude_NS[100];
        char Longitude[100];
        char Longitude_EW[100];
        char *Latitude_data="Latitude is:";
        char *Longitude_data="Longitude is:";
        char *line="\r\n";

       
       

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();

  
  MX_UART4_UART_Init();
  
  /* USER CODE BEGIN 2 */
        HAL_UART_Receive_IT(&huart2,aRxBuffer,1);
       
       
    HAL_UART_Receive_IT(&huart4,aRxBuffer,1);
       
  /* USER CODE END 2 */



  uint8_t i2=0;
  int temp=0;
  char byte[2];
  char show[200];
  
  


  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  
       
        //在此处应该把从GPS得到的定位数据变成需要发送的内容,也就是说content的内容应该变化成别的字符串。
        //其中若是需要发送到电脑并显示出来需要使用&huart2
         
                       
        //发送通信申请     
       
                            
                               
          
                          
  }
  /*
  USER CODE END 3
  */

}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

    /**Initializes the CPU, AHB and APB busses clocks
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Initializes the CPU, AHB and APB busses clocks
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure the Systick interrupt time
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}










/* USART2 init function */
static void MX_USART2_UART_Init(void)
{

  huart2.Instance = USART2;
  huart2.Init.BaudRate = 115200;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

/* USART3 init function */





/* UART4 init function */
static void MX_UART4_UART_Init(void)
{

  huart4.Instance = UART4;
  huart4.Init.BaudRate = 9600;
  huart4.Init.WordLength = UART_WORDLENGTH_8B;
  huart4.Init.StopBits = UART_STOPBITS_1;
  huart4.Init.Parity = UART_PARITY_NONE;
  huart4.Init.Mode = UART_MODE_TX_RX;
  huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart4.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart4) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}









/** Pinout Configuration
*/
static void MX_GPIO_Init(void)
{

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

}

/* USER CODE BEGIN 4 */

/*
uint8_t Rxbuff[200];
uint8_t RX_count_USART2=0;
uint8_t RX_Num_USART2=0;
*/




uint8_t Rxbuff2[200];
uint8_t RX_count_USART2_2=0;
uint8_t RX_Num_USART2_2=0;







char delims[]={',','*'};//字符串分割符号,和*

char *result_2;
char *result_3;
char *result_4;
char *result_5;
char *result_6;
char *result_7;
char *result_8;

char *line="\r\n";



char *Latitude_data="Latitude is:";
char *Longitude_data="Longitude is:";




void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
       
        uint8_t i2=0;

        int flag2=0;
        char Latitude[100];
        char Latitude_NS[100];
        char Longitude[100];
        char Longitude_EW[100];
        int temp=0;
        char byte[2];
        char show[200];
       
       


    //如果是串口4收到数据
                        /*
                    此处实现GPS是否已经发送数据的检测,若是已经发送数据到UART4串口,则进入下面的语句执行,在电脑上面显示经纬度。
                        GPS模块每隔1秒就会向stm32发送很多行代码,其中最重要的代码就是$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50                       
                        字段0:$GNRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐最小定位信息
                    字段1:UTC时间,hhmmss.sss格式
                    字段2:状态,A=定位,V=未定位
                    字段3:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
                    字段4:纬度N(北纬)或S(南纬)
                    字段5:经度dddmm.mmmm,度分格式(前导位数不足则补0)
                    字段6:经度E(东经)或W(西经)
                        字段7:速度,节,Knots
                        字段8:方位角,度
                        字段9:UTC日期,DDMMYY格式
                        字段10:磁偏角,(000 - 180)度(前导位数不足则补0)
                        字段11:磁偏角方向,E=东W=西
                        字段12:校验值
                        */               
        if(huart->Instance == UART4)
        {
                Rxbuff2[RX_count_USART2_2]=aRxBuffer[0];
                if((Rxbuff2[RX_count_USART2_2-1]==0X0D) && (Rxbuff2[RX_count_USART2_2]==0X0A)){                       
                        RX_Num_USART2_2=++RX_count_USART2_2;
                        RX_count_USART2_2=0;
                        flag2=1;
                }
                else
                        RX_count_USART2_2++;
                HAL_UART_Receive_IT(&huart4,aRxBuffer,1);//使能中断,继续接收数据
                //接收成功一条语句后,执行判断和处理
                if(flag2==1){
                        flag2=0;
                        RX_count_USART2_2=0;
                        //分割字符串,判断是GPS模块的哪一种回复
                        result_2=strtok((char *)Rxbuff2, delims);
                //GNRMC回复       
                if(strcmp(result_2,"$GNRMC")==0){
                                result_3=strtok(NULL, delims);//UTC时间
                            //HAL_UART_Transmit(&huart2,result_3,strlen(result_3),0XFFFF);
                            result_4=strtok(NULL, delims);//定位状态
                            //HAL_UART_Transmit(&huart2,result_4,strlen(result_4),0XFFFF);
                        if(strcmp(result_4,"A")==0){
                                HAL_UART_Transmit(&huart2,Latitude_data,strlen(Latitude_data),0XFFFF);
                                HAL_Delay(1000);
                            result_5=strtok(NULL, delims);//纬度
                            strcpy(Latitude,result_5);
                                HAL_UART_Transmit(&huart2,Latitude,strlen(Latitude),0XFFFF);
                                HAL_Delay(1000);
                            result_6=strtok(NULL, delims);//纬度N或S
                                strcpy(Latitude_NS,result_6);
                                HAL_UART_Transmit(&huart2,Latitude_NS,strlen(Latitude_NS),0XFFFF);
                                HAL_Delay(1000);
                                HAL_UART_Transmit(&huart2,line,strlen(line),0XFFFF);
                                HAL_Delay(1000);
                               
                               
                               
                                HAL_UART_Transmit(&huart2,Longitude_data,strlen(Longitude_data),0XFFFF);
                                HAL_Delay(1000);
                                result_7=strtok(NULL, delims);//经度
                            strcpy(Longitude,result_7);
                                HAL_UART_Transmit(&huart2,Longitude,strlen(Longitude),0XFFFF);
                                HAL_Delay(1000);
                            result_8=strtok(NULL, delims);//经度E或W
                                strcpy(Longitude_EW,result_8);
                                HAL_UART_Transmit(&huart2,Longitude_EW,strlen(Longitude_EW),0XFFFF);
                                HAL_Delay(1000);
                                HAL_UART_Transmit(&huart2,line,strlen(line),0XFFFF);
                                HAL_Delay(1000);
                        }
                       
                        }       
               
                }
                               
                               
                               
                                        //把字符数组给清空掉
                                        for(i2=0;i2<strlen(Latitude);i2++)
                                                Latitude[i2]='\0';
                            for(i2=0;i2<strlen(Latitude_NS);i2++)
                                                Latitude_NS[i2]='\0';
                            for(i2=0;i2<strlen(Longitude);i2++)
                                                Longitude[i2]='\0';
                                        for(i2=0;i2<strlen(Longitude_EW);i2++)
                                                Longitude_EW[i2]='\0';
                                       
                                }
                               
        }                       





/* USER CODE END 4 */

/**
  * @brief  Period elapsed callback in non blocking mode
  * @note   This function is called  when TIM1 interrupt took place, inside
  * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment
  * a global variable "uwTick" used as application time base.
  * @param  htim : TIM handle
  * @retval None
  */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* USER CODE BEGIN Callback 0 */

  /* USER CODE END Callback 0 */
  if (htim->Instance == TIM1) {
    HAL_IncTick();
  }
  /* USER CODE BEGIN Callback 1 */

  /* USER CODE END Callback 1 */
}

/**
  * @brief  This function is executed in case of error occurrence.
  * @param  file: The file name as string.
  * @param  line: The line in file as a number.
  * @retval None
  */
void _Error_Handler(char *file, int line)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  while(1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2018-8-12
在线时间
5 小时
发表于 2018-9-20 21:37:50 | 显示全部楼层
原子哥您好,我想要实现一个stm32通过串口4采集gps数据,然后把数据通过串口2发送给电脑的功能,采用的代码如上所示,但是经过实验以后发现串口2无法接到任何信息。在网上查了资料以后,发现可能是HAL_UART_RxCpltCallback函数的问题,但是没能找到确切的解决方法,所以我想和您请教一下,我这个程序里面到底哪个地方不对,望您解答。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 01:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表