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

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条回答 默认 最新

  • 乐观的study123 2022-07-02 06:58
    关注

    RXCount没清零,发送完就清0

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 Stata 面板数据模型选择
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用