#include "usart3.h" //串口接收缓存区 u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //接收缓冲,最大USART3_MAX_RECV_LEN个字节. u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //发送缓冲,最大USART3_MAX_SEND_LEN字节 vu16 point1 = 0; void USART3_Configuration(u32 baund) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //使能USART3 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); //GPIOB时钟 //NVIC_Configuration(); USART_DeInit(USART3); //复位串口1 //USART3_TX PB.10 PB.11 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART3); GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_USART3); USART_InitStructure.USART_BaudRate = baund; 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(USART3,&USART_InitStructure); USART_Cmd(USART3,ENABLE); USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//开启USART3的接收中断 //Usart1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;//串口3中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、 USART_ClearFlag(USART3,USART_FLAG_TC); //清除发送完成标志位 } void USART3_IRQHandler(void) { u8 Res; if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) { Res =USART_ReceiveData(USART3);//(USART1->DR); //读取接收到的数据 if(Res == 0x24) { point1 = 0; } USART3_RX_BUF[point1++] = Res; if(USART3_RX_BUF[0] == '$' && USART3_RX_BUF[4] == 'M' && USART3_RX_BUF[5] == 'C') //确定是否收到"GPRMC/GNRMC"这一帧数据 { if(Res == '\n') { memset(Save_Data.GPS_Buffer, 0, GPS_Buffer_Length); //清空 memcpy(Save_Data.GPS_Buffer, USART3_RX_BUF, point1); //保存数据 Save_Data.isGetData = 1; point1 = 0; memset(USART3_RX_BUF, 0, USART3_MAX_RECV_LEN); //清空 } } // if(USART3_RX_BUF[0] == '$' && USART3_RX_BUF[3] == 'G'&& USART3_RX_BUF[4] == 'G' && USART3_RX_BUF[5] == 'A') //确定是否收到"GPRMC/GNRMC"这一帧数据 // { // if(Res == '\n') // { // memset(Save_Data.GGA_Buffer, 0, GPS_Buffer_Length); //清空 // memcpy(Save_Data.GGA_Buffer, USART3_RX_BUF, point1); //保存数据 // Save_Data.isGetData = true; // point1 = 0; // memset(USART3_RX_BUF, 0, USART3_MAX_RECV_LEN); //清空 // } // // } if(point1 >= (USART3_MAX_RECV_LEN-1)) { point1 = 0; } } } //串口3,printf 函数 //确保一次发送数据不超过USART3_MAX_SEND_LEN字节 void u3_printf(char* fmt,...) { u16 i,j; va_list ap; va_start(ap,fmt); vsprintf((char*)USART3_TX_BUF,fmt,ap); va_end(ap); i=strlen((const char*)USART3_TX_BUF); //此次发送数据的长度 for(j=0;j