我系yyy 2022-07-01 23:20 采纳率: 40%
浏览 48
已结题

STM32 USART 串口通信一直发送

问题遇到的现象

不停的发送welcome,好像没有办法停止

#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
#include "string.h"
#include "stdio.h"
#define MAX 200

u8 RXBUFF[MAX];
u8 RXBUFF[MAX];
vu8 RXCount=0;
vu8 TXCount=0;
vu8 RXHeader=0;
vu8 RXlen=0;
vu8 RXOK=0;
unsigned char a[]="open";
unsigned char b[]="welcome";



u8 USART_RX_BUF[USART_REC_LEN];   
u16 USART_RX_STA=0; 
void My_USART1_Init(void)
{
    
    GPIO_InitTypeDef GPIO_InitStruction;
    USART_InitTypeDef USART_Initstruction;
    NVIC_InitTypeDef NVIC_InitStruction;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);   //使能USART1的时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);  //使能GPIOA的时钟
    
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
    
    
    GPIO_InitStruction.GPIO_Mode=GPIO_Mode_AF;        //GPIO设定
    GPIO_InitStruction.GPIO_OType=GPIO_OType_PP;
    GPIO_InitStruction.GPIO_Pin=GPIO_Pin_9;
    GPIO_InitStruction.GPIO_PuPd=GPIO_PuPd_UP;
    GPIO_InitStruction.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStruction);
    
    GPIO_InitStruction.GPIO_Mode=GPIO_Mode_AF;        //GPIO设定
    GPIO_InitStruction.GPIO_OType=GPIO_OType_PP;
    GPIO_InitStruction.GPIO_Pin=GPIO_Pin_10;
    GPIO_InitStruction.GPIO_PuPd=GPIO_PuPd_UP;
    GPIO_InitStruction.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStruction);
    
    
    
    USART_Initstruction.USART_BaudRate=9600;          //USART串口配置
    USART_Initstruction.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    USART_Initstruction.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
    USART_Initstruction.USART_Parity=USART_Parity_No;
    USART_Initstruction.USART_StopBits=USART_StopBits_1;
    USART_Initstruction.USART_WordLength=USART_WordLength_8b;
    
    USART_Init(USART1,&USART_Initstruction);
    USART_Cmd(USART1,ENABLE);                       //使能串口时钟    

    USART_GetFlagStatus(USART1,USART_FLAG_ORE);
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);    //USART1接受到数据就会产生中断
    
    
    
    NVIC_InitStruction.NVIC_IRQChannel=USART1_IRQn;     //中断配置
    
    NVIC_InitStruction.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitStruction.NVIC_IRQChannelPreemptionPriority=1;
    NVIC_InitStruction.NVIC_IRQChannelSubPriority=1;
    
    NVIC_Init(&NVIC_InitStruction);
    
    
    
    
}

void USART1_IRQHandler(void)
{
    
    if(USART_GetITStatus(USART1,USART_IT_RXNE))
    {
        RXBUFF[RXCount]=USART_ReceiveData(USART1);
        RXCount++;
        if(RXCount>200)
        {
            RXCount=0;
        }
        if((USART_RX_STA&0x8000)==0)//接收未完成
        {
            if(USART_RX_STA&0x4000)//接收到了0x0d
            {
                if(RXBUFF[RXCount]!=0x0a)USART_RX_STA=0;//接收错误,重新开始
                else USART_RX_STA|=0x8000;    //接收完成了 
            }
            else //还没收到0X0D
            {    
                if(RXBUFF[RXCount]==0x0d)USART_RX_STA|=0x4000;
                else
                {
                    USART_RX_BUF[USART_RX_STA&0X3FFF]=RXBUFF[RXCount] ;
                    USART_RX_STA++;
                    if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收      
                }         
            }
        }
    }
}


int main(void)
{
     unsigned char cnt=0;
    u8 mm;
    u8 i,k;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    My_USART1_Init();
    while(1)
    {
        if(RXCount>=4)
        {
            mm=USART_RX_STA&0X3FFF;
            cnt=0;
            for(i=0;i<4;i++)
            {
                if(RXBUFF[i]==a[i])
                {
                    cnt++;
                }
            }
            if(cnt==4)
            {
                for(k=0;k<7;k++)
                {
                USART_RX_BUF[k]=b[k];
                USART1->DR=USART_RX_BUF[k];
                while((USART1->SR&0X40)==0)
                    
                }
                cnt=0;
            }
        }
    }
    
}



  • 写回答

2条回答

      报告相同问题?

      相关推荐 更多相似问题

      问题事件

      • 系统已结题 7月10日
      • 已采纳回答 7月2日
      • 创建了问题 7月1日

      悬赏问题

      • ¥15 关于#C语言#的问题,如何解决?
      • ¥20 Vs2017 Help Viewer2.3 问题
      • ¥35 基于嵌入式linux的日程管理软件
      • ¥50 如何将list字符串添加到CSV文件表头?
      • ¥15 关于#javascript#的问题:通过ajax实现的局部刷新 如何将项目打包
      • ¥15 海思uboot USB3.0无法识别
      • ¥15 无法调用库文件,自己可以找到,但编译时显示没有
      • ¥15 安装PyQt5的时候这里创建虚拟环境是哪里?具体是怎么的?能录个视频吗
      • ¥20 php程序设计题不会!求解答!
      • ¥50 关于#python#的问题,如何解决?