串口数据乱码

2019-07-14 13:13发布

/*******************************************************************************
*******************************************************************************/
#include "STM32f10x_lib.h"
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART1_Configuration(void);
void USART2_Configuration(void);
void NVIC_Configuration(void);
void USART1_3G();
u16 i;//短延时用
/*******************************************************************************
* 函数名   : main
* 函数描述     : 主函数
*******************************************************************************/
int main(void)
{
    RCC_Configuration();//配置RCC时钟
    GPIO_Configuration(); //配置GPIO端口
   NVIC_Configuration();//配置nvic中断向量管理
    USART1_Configuration(); //配置USART1
    USART2_Configuration(); //配置USART2
  USART1_3G();//使用串口1首先完成3g模块初始化
    while(1)
    {
    }
}
void delay(int t)
{
int i,j;
for(i=0;i<3000;++i)
  for(j=0;j<30000;++j) ;
}
/***********************************************
@入参:串口号,单个字节
@函数说明:发送单个字节数据
***********************************************/
void USART_SEND(USART_TypeDef* USARTx,u8 Data)
{
USART1->SR;
USART_SendData(USARTx,Data);
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET){}
}
/***********************************************
@函数入参:串口号,字符串数组
@函数说明:发送数组
***********************************************/
void USART_SENDS(USART_TypeDef* USARTx,u8 send_data[])
{
while(*send_data!='')
{
  USART_SEND(USARTx,*send_data);
  send_data++;
}
}
/*
@参数:无参
@函数说明:串口1对3g模块发送at指令进行初始化
*/
void USART1_3G()
{
delay(150);
USART_SENDS(USART1,"at^ipinit="3gnet" ");
delay(200);
USART_SENDS(USART1,"at^ipopen=1,"TCP","103.44.145.245",17922,45678 ");
delay(150);
USART_SENDS(USART1,"AT^IPENTRANS=1 ");
delay(50);
}

/*******************************************************************************
* 函数名  : RCC_Configuration
* 函数描述   : 设置系统各部分时钟
*******************************************************************************/
void RCC_Configuration(void)
{
    ErrorStatus HSEStartUpStatus;//定义枚举类型变量 HSEStartUpStatus
    RCC_DeInit(); //复位系统时钟设置  
    RCC_HSEConfig(RCC_HSE_ON); //开启HSE   
    HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待HSE起振并稳定
    if(HSEStartUpStatus == SUCCESS)//判断HSE起是否振成功
    {
     RCC_HCLKConfig(RCC_SYSCLK_Div1);// 选择HCLK(AHB)时钟源为SYSCLK 1分频
     RCC_PCLK2Config(RCC_HCLK_Div1);//选择PCLK2时钟源为 HCLK(AHB) 1分频
     RCC_PCLK1Config(RCC_HCLK_Div2);//选择PCLK1时钟源为 HCLK(AHB) 2分频
     FLASH_SetLatency(FLASH_Latency_2);//设置FLASH延时周期数为2
     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能FLASH预取缓存
     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9 ,PLL输出频率为 8MHz * 9 = 72MHz
     RCC_PLLCmd(ENABLE); //使能PLL
     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//等待PLL输出稳定
     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择SYSCLK时钟源为PLL
     while(RCC_GetSYSCLKSource() != 0x08);//等待PLL成为SYSCLK时钟源
    }   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1| RCC_APB2Periph_GPIOA, ENABLE);  //开启USART1和GPIOA时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);  //开启USART2
}
/*******************************************************************************
* 函数名    : NVIC_Configuration
* 函数描述   : 设置NVIC
*******************************************************************************/
void NVIC_Configuration(void)
{           
    NVIC_InitTypeDef NVIC_InitStructure;
#ifdef  VECT_TAB_RAM  
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);/* Set the Vector Table base location at 0x20000000 */  
#else  /* VECT_TAB_FLASH  */    /* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
#endif
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQChannel ;  //通道设置为串口2中断
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   //中断占先等级0
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;          //中断响应优先级0,赋予高的优先级
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             //打开中断
   NVIC_Init(&NVIC_InitStructure);
}
/*******************************************************************************
* 函数名    : GPIO_Configuration
* 函数描述     : 设置各GPIO端口功能
*******************************************************************************/
void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;//定义 GPIO 初始化结构体 GPIO_InitStructure
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//设置USART1的Tx脚(PA.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;//设置USART1的Rx脚(PA.10)为上拉输入脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOA , &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//设置USART2的Tx脚(PA.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;//设置USART2的Rx脚(PA.3)为浮空输入脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA , &GPIO_InitStructure);   
}
/*******************************************************************************
* 函数名    : USART1_Configuration
* 函数描述     : 设置USART1
*******************************************************************************/
void USART1_Configuration(void)
{
    USART_InitTypeDef USART_InitStructure; //定义USART初始化结构体 USART_InitStructure
    USART_InitStructure.USART_BaudRate = 115200;//波特率为9600bps
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据长度
    USART_InitStructure.USART_StopBits = USART_StopBits_1;//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); //使能USART1
    USART_ClearFlag(USART1,USART_FLAG_TC);//发送完成标志位  
}
/*******************************************************************************
* 函数名    : USART2_Configuration
* 函数描述     : 设置USART2
*******************************************************************************/
void USART2_Configuration(void)
{
    USART_InitTypeDef USART_InitStructure; //定义USART初始化结构体 USART_InitStructure
    USART_InitStructure.USART_BaudRate = 115200;//波特率为9600bps
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据长度
    USART_InitStructure.USART_StopBits = USART_StopBits_1;//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);//用初始化后的结构体来初始化串口2,调用函数
    USART_Cmd(USART2 , ENABLE); //使能USART2
   USART_ITConfig(USART2,USART_IT_RXNE,ENABLE); //一定要开启串口接收中断
    USART_ClearFlag(USART2,USART_FLAG_TC);//发送完成标志位  
}
/*******************************************************************************
* 函数名    : USART2_IRQHandler
* 函数描述     : 串口2的中断函数入口
* 函数说明  :该中断函数在stm32f10x_it.c,为方便理解而剪切到main.c
*******************************************************************************/
void USART2_IRQHandler(void)
{
  if(USART_GetFlagStatus(USART2 , USART_IT_RXNE) == SET)
     {
      USART_ClearITPendingBit(USART2,USART_IT_RXNE);      
    USART_SendData(USART1 , USART_ReceiveData(USART2));
       for(i = 0; i < 500; i ++);
  }
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
苏州名之卓
1楼-- · 2019-07-15 09:48
提醒一声,你最好把延迟去掉,串口发送接收数据都是完成后置位相应的标记位的,只要判断标记位就可以了,随便加延迟可能会影响程序的执行效率的。
ryanyhh
2楼-- · 2019-07-15 13:15
中断里面尽量不要加延时,在程序变大,代码变多了之后,中断的延时会带来莫名其妙的问题,最常见的就是挂死,并且找不出来原因。
FRAN2016
3楼-- · 2019-07-15 17:58
楼上说的是,中断里加延时,是什么目的?
asd004
4楼-- · 2019-07-15 22:55
 精彩回答 2  元偷偷看……
f1070388065
5楼-- · 2019-07-16 03:31
延时问题
wtefewrws
6楼-- · 2019-07-16 07:04
1、需要电平转换芯片 2、串口助手需要选择接收字符还是字符串3.是否共地 4、查看程序发送数据部分

一周热门 更多>