你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

串口数据乱码 急急急

[复制链接]
盲人毕设 提问时间:2017-6-1 22:24 /
/*******************************************************************************
*******************************************************************************/
#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!='\0')
{
  USART_SEND(USARTx,*send_data);
  send_data++;
}
}
/*
@参数:无参
@函数说明:串口1对3g模块发送at指令进行初始化
*/
void USART1_3G()
{
delay(150);
USART_SENDS(USART1,"at^ipinit=\"3gnet\"\r\n");
delay(200);
USART_SENDS(USART1,"at^ipopen=1,\"TCP\",\"103.44.145.245\",17922,45678\r\n");
delay(150);
USART_SENDS(USART1,"AT^IPENTRANS=1\r\n");
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 ++);
  }
}

IMG_1445.JPG

串口2收 串口1ttl连电脑

串口2收 串口1ttl连电脑
收藏 评论13 发布时间:2017-6-1 22:24

举报

13个回答
盲人毕设 回答时间:2017-6-1 22:25:23
小弟实在不知道为什么 乱码了。。。帮忙给我写代码的人不理我了 收完钱就不理我了。。
zhao.zhao 回答时间:2017-6-2 08:43:38
串口1连接电脑不应该是TTL的吧,至少得用MAX232转换一下的,或则USB转串口的,注意电平的匹配
ic界中lol打的最好的 回答时间:2017-6-2 09:10:50
看看数据格式是否正确?
星辰一方 回答时间:2017-6-2 09:56:20
看上去是有规律的,1)看下波特率,2)接收使用HEX格式看看,换个串口客户端
废鱼 回答时间:2017-6-2 10:19:00
仿真一下,看看串口2读取到的数据对不对。按照楼上各位的方法,先排除电平问题,再排除代码问题。
还是要自己做的好,万事都要靠自己,不懂的大家一起讨论。
盲人毕设 回答时间:2017-6-2 13:04:14
正常了 之前数据一直存在丢包  我把延时改短了 i < 150
mon51 回答时间:2017-6-3 10:27:11
1:检查你主板的晶振的频率是否与程序设置的一致
2:检查UART的波特率、校验方式、停止位。
zhao.zhao 回答时间:2017-6-3 10:49:16
提醒一声,你最好把延迟去掉,串口发送接收数据都是完成后置位相应的标记位的,只要判断标记位就可以了,随便加延迟可能会影响程序的执行效率的。
深谷幽泉 回答时间:2017-6-4 19:32:31
中断里面尽量不要加延时,在程序变大,代码变多了之后,中断的延时会带来莫名其妙的问题,最常见的就是挂死,并且找不出来原因。
没事逛荡 回答时间:2017-6-4 22:02:43
楼上说的是,中断里加延时,是什么目的?
原田夜舞love 回答时间:2017-6-4 22:36:09
中断中最好不要加延时
epochal 回答时间:2017-6-5 06:54:53
延时问题
努力的人 回答时间:2017-6-5 08:20:45
1、需要电平转换芯片 2、串口助手需要选择接收字符还是字符串3.是否共地 4、查看程序发送数据部分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版