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

串口数据乱码 急急急

[复制链接]
盲人毕设 提问时间: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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版