OpenEdv-开源电子网

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

USART3无法发送接收数据,有哪位高手帮帮小弟,小弟是新手!

[复制链接]

5

主题

13

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2017-10-16
在线时间
10 小时
发表于 2017-10-27 02:37:48 | 显示全部楼层 |阅读模式
10金钱
这是主程序:#include "pbdata.h"
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void USART_Configuration(void);

int fputc(int ch,FILE *f) //printf        重定向
{
        USART_SendData(USART1,(u8)ch);
        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
        return ch;
}


int main(void)
{


   RCC_Configuration();        //系统时钟初始化
   GPIO_Configuration();//端口初始化
   USART_Configuration();//串口初始化
   NVIC_Configuration();//中断初始化

   while(1)
   {
                      u8 i=0;
                  for(i=0;i<14;i++)
                  {

              USART_SendData(USART3,txd[i]);
              while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET); //串口3发送完成标志检测
       
        }


         
            while( USART_GetFlagStatus(USART3,USART_FLAG_RXNE)== RESET)//串口3接收数据标志检测
                {
         
                printf(" RxData[0]=%10x\r\n",RxData[0]);
                delay_ms(1000);
            delay_ms(1000);
            
                        printf(" RxData[1]=%10x\r\n",RxData[1]);
                delay_ms(1000);
            delay_ms(1000);
                    printf(" RxData[2]=%10x\r\n",RxData[2]);
                delay_ms(1000);
            delay_ms(1000);
                    printf(" RxData[3]=%10x\r\n",RxData[3]);
                delay_ms(1000);
            delay_ms(1000);
                    printf(" RxData[4]=%10x\r\n",RxData[4]);
                delay_ms(1000);
            delay_ms(1000);
                }
            
       
               
          
            
            
    }
           
         

          //d1=123456;
          //printf("10进制整型输出 d1=%10d\r\n",d1);

          //d1=123456;
          //printf("16进制输出 d1=%X\r\n",d1);//X 大写输出  x小写输出

          //d2=12.345;
          //printf("浮点数输出 d2=%f\r\n",d2);
          ///printf("浮点数输出 d2=%.2f\r\n",d2);
          //printf("浮点数输出 d2=%10.2f\r\n",d2);

          //d3='a';
          //printf("字符输出 d3=%c\r\n",d3);


          
          
}

void RCC_Configuration(void)
{
    SystemInit();//72m
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//管脚A时钟打开
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); //管脚D时钟打开
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口1时钟打开
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//串口3时钟打开
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//复用时钟打开
        GPIO_PinRemapConfig(GPIO_FullRemap_USART3,ENABLE);//串口3端口重映射

}
void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;       
        //串口1管脚配置
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA,&GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RX
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
           //串口3管脚配置
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//TX
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_Init(GPIOD,&GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//RX
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOD,&GPIO_InitStructure);
}

void NVIC_Configuration(void)
{
           NVIC_InitTypeDef NVIC_InitStructure;

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        //串口1中断配置
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);


        //串口3中断配置
        NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}

void USART_Configuration(void)
{
     //串口1初始化
    USART_InitTypeDef  USART_InitStructure;

        USART_InitStructure.USART_BaudRate=9600;
        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(USART1,&USART_InitStructure);
        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
        USART_Cmd(USART1,ENABLE);
        USART_ClearFlag(USART1,USART_FLAG_TC);
         //串口1初始化3初始化
        USART_InitStructure.USART_BaudRate=9600;
        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_ITConfig(USART3,USART_IT_RXNE,ENABLE);
        USART_Cmd(USART3,ENABLE);
        USART_ClearFlag(USART3,USART_FLAG_TC);
        }

中断程序:


#include "stm32f10x_it.h"         
#include "stm32f10x_exti.h"
#include "stm32f10x_rcc.h"
#include "misc.h"
#include "pbdata.h"

void NMI_Handler(void)
{
}

void USART1_IRQHandler(void)
{
   if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//串口1接收中断检测
   {
                USART_SendData(USART1,USART_ReceiveData(USART1));
                while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
   }
}
void USART3_IRQHandler(void)

{         



   if(USART_GetITStatus(USART3,USART_IT_RXNE)!=RESET)//串口3接收中断检测
   {



                      while( USART_GetFlagStatus(USART3,USART_FLAG_RXNE)!= RESET)//串口3接收数据标志检测
                         {
                           RxData[flag]=USART_ReceiveData(USART3);
                            flag++;
                                }
                                flag=0;
       
   }

}


公共函数:

#ifndef _pbdata_H
#define _pbdata_H
#include "stm32f10x.h"
#include "misc.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_usart.h"
#include "stdio.h"

//定义变量

extern u8 dt;

extern u8 flag;
extern u8 RxData[14];
extern u8 txd[14];
//定义函数

void RCC_HSE_Configuration(void);
void delay(u32 nCount);
void delay_us(u32 nus);
void delay_ms(u16 nms);

#endif




这是要发送的数据数组:u8 RxData[14]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  这是要接收的数据存放数组u8 txd[14]={0xFF,0xFF,0x0B,0x00,0x00,0x7B,0x81,0x01,0x00,0x00,0x02,0x00,0x00,0x0A};



求哪位大侠伸出援手,帮帮小弟,小弟真心感谢,搞了两天已经人废了,都搞不出,百度论坛各种找,查不出原因!



最佳答案

查看完整内容[请看2#楼]

谢谢八度空间,liuliupiaoxue热心回复,问题的关键已经找到了,已经解决了,主要问题出现在中断哪里,没处理flag++,所以出来都是0,接收不到数据。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

13

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2017-10-16
在线时间
10 小时
 楼主| 发表于 2017-10-27 02:37:49 | 显示全部楼层
谢谢八度空间,liuliupiaoxue热心回复,问题的关键已经找到了,已经解决了,主要问题出现在中断哪里,没处理flag++,所以出来都是0,接收不到数据。
回复

使用道具 举报

5

主题

13

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2017-10-16
在线时间
10 小时
 楼主| 发表于 2017-10-27 02:40:30 | 显示全部楼层
这是要接收的数据存放数组:u8 RxData[14]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
这是要发送的数据数组:u8 txd[14]={0xFF,0xFF,0x0B,0x00,0x00,0x7B,0x81,0x01,0x00,0x00,0x02,0x00,0x00,0x0A};
刚才小弟头昏眼花,把这个弄相反了,希望没影响到大侠心情。
回复

使用道具 举报

5

主题

13

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2017-10-16
在线时间
10 小时
 楼主| 发表于 2017-10-27 02:45:12 | 显示全部楼层
哪位大侠帮帮小弟吧,小弟把仅有的金币都奉上,真的是让我人都废了
回复

使用道具 举报

2

主题

73

帖子

0

精华

高级会员

Rank: 4

积分
659
金钱
659
注册时间
2017-5-19
在线时间
146 小时
发表于 2017-10-27 08:49:40 | 显示全部楼层
应是如下的地方弄错了,检查是否还有类似的问题。
1.jpg
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-10-27 09:04:42 | 显示全部楼层
在发送之前也检查一下TC标志
回复

使用道具 举报

5

主题

13

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2017-10-16
在线时间
10 小时
 楼主| 发表于 2017-10-27 09:27:46 | 显示全部楼层
@4楼应是如下的地方弄错了,检查是否还有类似的问题。
1.jpg (49.42 KB, 下载次数: 0)
1.jpg
你说的我已经改过了,还是不行
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-19 02:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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