OpenEdv-开源电子网

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

求助各位坛友,数据电台通过串口通信的问题

[复制链接]

24

主题

72

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2018-3-13
在线时间
45 小时
发表于 2018-7-23 13:03:57 | 显示全部楼层 |阅读模式
20金钱
求助各位坛友!!!
我这边做了一个数据电台通信的代码,电路是电台和PC端的串口,还有电台和单片机的串口连接,电台通过串口发信息的时候(该信息就十个字节左右),信息会同时发送到PC端的串口助手和单片机里。测试的时候会有如下情况,PC端的串口助手都能接收到所有的信息说明电台是有发送的,就是单片机的串口有时候能收到,有时候收不到。我用的是STM32F103C8T6的串口2,请问这种情况会因为什么而造成的呢?硬件电路都没有问题,
串口代码如下:
char USART2_BUF[100]={0};//定义一个串口2的接收缓冲区
char USART2_NUM = 0;//串口2的缓冲数
/*
函数名称:串口2初始化函数
函数参数:波特率
函数返回值:无
函数备注:TX--PA2,RX--PA3
*/
void usart2_init(unsigned int bound){
GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO类型的结构体
USART_InitTypeDef USART_InitStructure;//定义一个usart类型的结构体
NVIC_InitTypeDef NVIC_InitStructure;//定义一个nvic类型的结构体
//打开时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开PA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);//开串口2时钟
//TX--PA2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置速度
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //配置成复用输出功能
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
//RX--PA3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//配置成浮空输入功能
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
//USART2参数配置
USART_InitStructure.USART_BaudRate = bound;//设置波特率:bound
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_Mode = USART_Mode_Rx | USART_Mode_Tx;//开启接收和发送模式
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件流控制
USART_Init(USART2, &USART_InitStructure); //初始化串口2
//中断设置
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//串口2中断服务函数
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 1;//抢占优先级设置
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//响应优先级设置
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//中断开启
NVIC_Init(&NVIC_InitStructure); //初始化
//开启USART2
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接收中断
USART_Cmd(USART2, ENABLE);//串口
}
/*串口2接收中断服务函数*/
void USART2_IRQHandler(void)  
{  
   if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == SET)  
   {      
      USART2_BUF[USART2_NUM] = USART_ReceiveData(USART2);
   USART2_NUM++;
   if(USART2_NUM>98)
   {
    memset(USART2_BUF,0,sizeof(USART2_BUF));
    USART2_NUM = 0;
   }   
   }
}

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

使用道具 举报

20

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2015-11-28
在线时间
89 小时
发表于 2018-7-23 13:31:15 | 显示全部楼层
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6745
金钱
6745
注册时间
2017-4-12
在线时间
1258 小时
发表于 2018-7-23 13:39:11 | 显示全部楼层
/*串口2接收中断服务函数*/
void USART2_IRQHandler(void)  
{  
   if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == SET)  
   {      
      USART2_BUF[USART2_NUM] = USART_ReceiveData(USART2);
   USART2_NUM++;
   if(USART2_NUM>98)
   {
    memset(USART2_BUF,0,sizeof(USART2_BUF));
    USART2_NUM = 0;
   }   
   }
}

一次10个字节的话,串口中断处理下,计数接收到10个字节,则计数标志清零
回复

使用道具 举报

24

主题

72

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2018-3-13
在线时间
45 小时
 楼主| 发表于 2018-7-23 13:52:21 | 显示全部楼层
245925587 发表于 2018-7-23 13:39
/*串口2接收中断服务函数*/
void USART2_IRQHandler(void)  
{  

我设置的是BUF[100]的,接收满了100就memset再继续接收,但是这个地方跟我描述的没什么关系,我用仿真去调试,当出现帖子描述的那种情况的时候,串口助手会接收到“NO ERROR”,而单片机BUF里的是空的。。。
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2020-6-27
在线时间
9 小时
发表于 2020-7-4 22:52:54 | 显示全部楼层
楼主解决了吗,可以分享一下代码吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 21:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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